Facial Emotion Detection¶

Problem Definition¶

The context: Deep learning has applications in predictive tasks relating to unstructured data, for example, images, text, audio and video. Artificial emotional intelligence is the study and development of technologies that can read human emotions by analyzing body gestures, facial expressions, voice tone etc and can react appropriately to them.

Facial expression recognition is critical in human-machine interactions. Research shows that 55% of communication is through facial expressions and other visual cues. Training a model to identify facial emotions accurately is an important step towards emotional intelligent behaviour in artificially intelligent machines.

Automatic facial expression recognition systems have applications in understanding human behavior, health care and wellbeing, creating higher quality virtual assistants for customer facing businesses.
The objectives: Use deep learning techniques to create a computer vision model that accurately detects facial emotions. The model should perform multi-class classification on images of facial expressions, classifying the expressions according to the associated emotion.
The key questions:

  1. Can I build a deep learning model to classify human emotions?
  2. What data will be consumed by the model?
  3. What model architectures will be explored?
  4. What performance metrics will be used to gauge model effectiveness?
  5. What are the resource costs (time + compute) needed for the model?
  6. What are the potential risks (misclassification)?
  7. What is the recommendation?
    The problem formulation: Build an efficient deep learning model to accurately detect human emotions from images of people's faces. The model should perform multi-class classification.

About the dataset¶

The data set consists of 3 folders, i.e., 'test', 'train', and 'validation'. Each of these folders has four subfolders:

‘happy’: Images of people who have happy facial expressions.
‘sad’: Images of people with sad or upset facial expressions.
‘surprise’: Images of people who have shocked or surprised facial expressions.
‘neutral’: Images of people showing no prominent emotion in their facial expression at all.

Importing the Libraries¶

In [1]:
#Import required libraries
import warnings
warnings.filterwarnings("ignore")

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import os
import zipfile
from PIL import Image
from collections import Counter
import hashlib
import json

#Import Deep Learning Libraries
import tensorflow as tf
from tensorflow.keras.utils import load_img, img_to_array
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import (
    Dense, Input, Dropout, GlobalAveragePooling2D, LeakyReLU,
    Flatten, Conv2D, BatchNormalization, Activation, MaxPooling2D)
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras import optimizers
from tensorflow.keras.optimizers import Adam, SGD, RMSprop
from tensorflow.keras.models import load_model
from tensorflow.keras.activations import swish
from tensorflow.keras import regularizers

Mounting the Drive¶

NOTE: Please use Google Colab from your browser for this notebook. Google.colab is NOT a library that can be downloaded locally on your device.

In [2]:
#Mount Google Drive
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
In [3]:
#Store the path of the data file from Google Drive
path = '/content/drive/MyDrive/MachineLearningCourse/CapstoneProject/Facial_emotion_images.zip'

#The data is stored as a zip file so we need to extract the files from the zip file
with zipfile.ZipFile(path, 'r') as zip_ref:
  zip_ref.extractall()

Let us load and unzip the data¶

Note:

  • You must download the dataset from the link provided on Olympus and upload the same on your Google drive before executing the code in the next cell.
  • In case of any error, please make sure that the path of the file is correct as the path may be different for you.
In [4]:
#Loop through images in the training, and check image size
train_folder_path = "Facial_emotion_images/train/surprise"
val_folder_path = "Facial_emotion_images/validation/surprise"
test_folder_path = "Facial_emotion_images/test/surprise"

def determineImagePath(path):
  image_count = 0

  for file_name in os.listdir(path):
    image_path = os.path.join(path,file_name)
    with Image.open(image_path) as img:
      width, height = img.size
      num_pixels = width * height
      print(f"{file_name} at path {path} has size:{width}x{height}, Total pixels: {num_pixels}")

      #Increment the counter
      image_count+=1

      if image_count >= 5:
        break

determineImagePath(train_folder_path)
print()
determineImagePath(val_folder_path)
print()
determineImagePath(test_folder_path)

picture_size = 48
621.jpg at path Facial_emotion_images/train/surprise has size:48x48, Total pixels: 2304
8979.jpg at path Facial_emotion_images/train/surprise has size:48x48, Total pixels: 2304
19231.jpg at path Facial_emotion_images/train/surprise has size:48x48, Total pixels: 2304
19322.jpg at path Facial_emotion_images/train/surprise has size:48x48, Total pixels: 2304
24688.jpg at path Facial_emotion_images/train/surprise has size:48x48, Total pixels: 2304

21154.jpg at path Facial_emotion_images/validation/surprise has size:48x48, Total pixels: 2304
26102.jpg at path Facial_emotion_images/validation/surprise has size:48x48, Total pixels: 2304
20594.jpg at path Facial_emotion_images/validation/surprise has size:48x48, Total pixels: 2304
17027.jpg at path Facial_emotion_images/validation/surprise has size:48x48, Total pixels: 2304
7874.jpg at path Facial_emotion_images/validation/surprise has size:48x48, Total pixels: 2304

88.jpg at path Facial_emotion_images/test/surprise has size:48x48, Total pixels: 2304
237.jpg at path Facial_emotion_images/test/surprise has size:48x48, Total pixels: 2304
39.jpg at path Facial_emotion_images/test/surprise has size:48x48, Total pixels: 2304
175.jpg at path Facial_emotion_images/test/surprise has size:48x48, Total pixels: 2304
227.jpg at path Facial_emotion_images/test/surprise has size:48x48, Total pixels: 2304

Observation:¶

Train, validation, and test images are 48 x 48 pixels and are stored in jpg format

Visualizing our Classes¶

Let's look at our classes.

Write down your observation for each class. What do you think can be a unique feature of each emotion, that separates it from the remaining classes?

In [5]:
def visualizeFaces(theemotion, folder_path):

  plt.figure(figsize = (12,12))

  for i in range(1,10,1):
    plt.subplot(3,3,i)
    img = load_img(folder_path + theemotion + "/" +
                  os.listdir(folder_path + theemotion)[i], target_size = (picture_size,picture_size))

    plt.imshow(img)

  plt.show()

Happy¶

In [6]:
# Visualizing happy faces
train_folder_path = "Facial_emotion_images/train/"
emotion = 'happy'
visualizeFaces(emotion, train_folder_path)
No description has been provided for this image

Observations and Insights:__

  1. The images are pictures of people smiling that are cropped to focus on the face
  2. Happy faces often show the person's teeth
  3. Happy faces show a triangle shape from the nose to the mouth as the mouth stretches into a smile
  4. Eye brows can often be curved as a person smiles
  5. Eyes can become narrow as a person smiles
  6. In some of the images, the head is slightly tilted and this will help with data augmentation

Sad¶

In [7]:
# Visualizing sad faces
train_folder_path = "Facial_emotion_images/train/"
emotion = 'sad'
visualizeFaces(emotion, train_folder_path)
No description has been provided for this image

Observations and Insights:__

  1. The images are pictures of sad people that are cropped to focus on the face
  2. When people are sad, they often place hands on their cheeks probably as a supportive gesture
  3. In sad faces, the mouth often is in a straight line shape
  4. In sad faces, the eyes are very expressive and open wide

Neutral¶

In [8]:
# Visualizing neutral faces
train_folder_path = "Facial_emotion_images/train/"
emotion = 'neutral'
visualizeFaces(emotion, train_folder_path)
No description has been provided for this image

Observations and Insights:__

  1. The images are pictures of neutral faces that are cropped to focus on the face
  2. When people are neutral, the facial features are not stretched. For example, the mouth may be in the neutral position
  3. Sometimes neutral faces look like sad faces. It will be interesting to see if the neural networks are able to distinguish sad verses neutral faces.
  4. The eyes are also very expressive in neutral faces.

Surprised¶

In [9]:
# Visualizing faces showing surprise
train_folder_path = "Facial_emotion_images/train/"
emotion = 'surprise'
visualizeFaces(emotion, train_folder_path)
No description has been provided for this image

Observations and Insights:__

  1. The images are pictures of surprised people that are cropped to focus on the face
  2. In surprised faces, the mouth is open wide and sometimes, the teeth are not visible in the suprised look
  3. Often people place both hands on their faces when surprised
  4. Eyes are open wide in surprised faces.

Checking Distribution of Classes¶

In [10]:
#Method to determine class distribution in a folder
def determineClassDistributionInFolder(folderPath):
  class_counts = Counter()
  for class_folder in os.listdir(folderPath):
    class_folder_path = os.path.join(folderPath, class_folder)
    if os.path.isdir(class_folder_path):
      num_images = len([f for f in os.listdir(class_folder_path) if f.endswith(".jpg")])
      class_counts[class_folder] = num_images

  #Print class distribution
  print("Class Distribution in:",folderPath)
  for class_name, count in class_counts.items():
    print(f"{class_name}: {count} images")

  total_images = sum(class_counts.values())
  # Define a color map or list of colors
  colors = ['skyblue', 'lightgreen', 'salmon', 'gold']

  plt.figure(figsize=(7,7))
  bars = plt.bar(class_counts.keys(), class_counts.values(), color=colors[:len(class_counts)])

  for bar, count in zip(bars, class_counts.values()):
    percentage = (count/total_images) * 100
    plt.text(
        bar.get_x() + bar.get_width()/2,
        bar.get_height() + 0.5,
        f"{count:,}; {percentage:.1f}%",
        ha='center',va='bottom',fontsize=10
    )

  plt.xlabel('Class')
  plt.ylabel('Number of Images')
  plt.title('Class Distribution')
  plt.xticks(rotation=45)
  plt.savefig('class_distribution.png', format="png", dpi=300, bbox_inches="tight")
  plt.show()


  #determine imbalance ratio
  imbalance_ratio = max(class_counts.values()) / min(class_counts.values())
  print(f"Imbalance Ratio:{imbalance_ratio:.2f}")
In [11]:
#Plot distribution of classes in the training folder
folder_path = "Facial_emotion_images/train/"
determineClassDistributionInFolder(folder_path)
Class Distribution in: Facial_emotion_images/train/
sad: 3982 images
surprise: 3173 images
neutral: 3978 images
happy: 3976 images
No description has been provided for this image
Imbalance Ratio:1.25

Think About It:

  • Are the classes equally distributed? If not, do you think the imbalance is too high? Will it be a problem as we progress?
  • Are there any Exploratory Data Analysis tasks that we can do here? Would they provide any meaningful insights?

Observations and Insights:__

  1. The classes are almost equally distributed. There are 21% surprise images and ~26% images for the other categories (sad, happy, and neutral).
  2. The imbalance is not too severe and may not significantly impact predictive accuracy.
In [12]:
#function to calculate file hash
def calculateHash(file_path):
  hasher = hashlib.md5()
  with open(file_path, 'rb') as f:
    buf = f.read()
    hasher.update(buf)
    return hasher.hexdigest()

#Create a method to check for image duplicates
def determineImageDuplicates(folderPath):
  #Dictionary to store hash and corresponding file paths
  hashes = {}

  duplicates = []
  for root,_, files in os.walk(folderPath):
    for file_name in files:
      if file_name.endswith(".jpg"):
        file_path = os.path.join(root, file_name)
        file_hash = calculateHash(file_path)
        if file_hash in hashes:
          duplicates.append((file_path, hashes[file_hash]))
        else:
          hashes[file_hash] = file_path

  print("Duplicate Images: ", len(duplicates))

  for dup in duplicates:
    print(f"Duplicate: {dup[0]} -> Original:{dup[1]}")

  print("Example of 5 duplicate images:")
  for dup in duplicates[:5]:
    print(f"Duplicate: {dup[0]} -> Original:{dup[1]}")
    #Open both duplicate images
    img1 = Image.open(dup[0])
    img2 = Image.open(dup[1])

    plt.figure(figsize = (7,7))

    plt.subplot(1,2,1)
    plt.imshow(img1)
    plt.title(f"Duplicate: {os.path.basename(dup[0])}")
    plt.axis('off')

    plt.subplot(1,2,2)
    plt.imshow(img2)
    plt.title(f"Duplicate: {os.path.basename(dup[1])}")
    plt.axis('off')

    plt.show()
In [13]:
#Check for duplicates in training happy images
determineImageDuplicates('Facial_emotion_images/train/happy/')
Duplicate Images:  32
Duplicate: Facial_emotion_images/train/happy/19817.jpg -> Original:Facial_emotion_images/train/happy/27550.jpg
Duplicate: Facial_emotion_images/train/happy/21407.jpg -> Original:Facial_emotion_images/train/happy/27552.jpg
Duplicate: Facial_emotion_images/train/happy/18902.jpg -> Original:Facial_emotion_images/train/happy/20242.jpg
Duplicate: Facial_emotion_images/train/happy/20944.jpg -> Original:Facial_emotion_images/train/happy/25901.jpg
Duplicate: Facial_emotion_images/train/happy/20258.jpg -> Original:Facial_emotion_images/train/happy/20533.jpg
Duplicate: Facial_emotion_images/train/happy/21607.jpg -> Original:Facial_emotion_images/train/happy/26061.jpg
Duplicate: Facial_emotion_images/train/happy/31292.jpg -> Original:Facial_emotion_images/train/happy/16390.jpg
Duplicate: Facial_emotion_images/train/happy/34825.jpg -> Original:Facial_emotion_images/train/happy/16693.jpg
Duplicate: Facial_emotion_images/train/happy/30217.jpg -> Original:Facial_emotion_images/train/happy/32594.jpg
Duplicate: Facial_emotion_images/train/happy/17753.jpg -> Original:Facial_emotion_images/train/happy/22723.jpg
Duplicate: Facial_emotion_images/train/happy/34976.jpg -> Original:Facial_emotion_images/train/happy/29894.jpg
Duplicate: Facial_emotion_images/train/happy/17595.jpg -> Original:Facial_emotion_images/train/happy/19943.jpg
Duplicate: Facial_emotion_images/train/happy/29095.jpg -> Original:Facial_emotion_images/train/happy/22463.jpg
Duplicate: Facial_emotion_images/train/happy/28470.jpg -> Original:Facial_emotion_images/train/happy/22838.jpg
Duplicate: Facial_emotion_images/train/happy/32166.jpg -> Original:Facial_emotion_images/train/happy/26782.jpg
Duplicate: Facial_emotion_images/train/happy/17436.jpg -> Original:Facial_emotion_images/train/happy/18933.jpg
Duplicate: Facial_emotion_images/train/happy/27142.jpg -> Original:Facial_emotion_images/train/happy/25086.jpg
Duplicate: Facial_emotion_images/train/happy/17814.jpg -> Original:Facial_emotion_images/train/happy/22895.jpg
Duplicate: Facial_emotion_images/train/happy/17407.jpg -> Original:Facial_emotion_images/train/happy/26677.jpg
Duplicate: Facial_emotion_images/train/happy/24752.jpg -> Original:Facial_emotion_images/train/happy/21340.jpg
Duplicate: Facial_emotion_images/train/happy/21839.jpg -> Original:Facial_emotion_images/train/happy/28220.jpg
Duplicate: Facial_emotion_images/train/happy/27042.jpg -> Original:Facial_emotion_images/train/happy/29353.jpg
Duplicate: Facial_emotion_images/train/happy/27638.jpg -> Original:Facial_emotion_images/train/happy/21625.jpg
Duplicate: Facial_emotion_images/train/happy/28728.jpg -> Original:Facial_emotion_images/train/happy/32350.jpg
Duplicate: Facial_emotion_images/train/happy/28698.jpg -> Original:Facial_emotion_images/train/happy/25703.jpg
Duplicate: Facial_emotion_images/train/happy/30891.jpg -> Original:Facial_emotion_images/train/happy/27945.jpg
Duplicate: Facial_emotion_images/train/happy/32416.jpg -> Original:Facial_emotion_images/train/happy/23895.jpg
Duplicate: Facial_emotion_images/train/happy/26080.jpg -> Original:Facial_emotion_images/train/happy/19208.jpg
Duplicate: Facial_emotion_images/train/happy/33854.jpg -> Original:Facial_emotion_images/train/happy/19899.jpg
Duplicate: Facial_emotion_images/train/happy/34961.jpg -> Original:Facial_emotion_images/train/happy/27858.jpg
Duplicate: Facial_emotion_images/train/happy/34368.jpg -> Original:Facial_emotion_images/train/happy/21488.jpg
Duplicate: Facial_emotion_images/train/happy/20370.jpg -> Original:Facial_emotion_images/train/happy/30166.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/train/happy/19817.jpg -> Original:Facial_emotion_images/train/happy/27550.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/happy/21407.jpg -> Original:Facial_emotion_images/train/happy/27552.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/happy/18902.jpg -> Original:Facial_emotion_images/train/happy/20242.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/happy/20944.jpg -> Original:Facial_emotion_images/train/happy/25901.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/happy/20258.jpg -> Original:Facial_emotion_images/train/happy/20533.jpg
No description has been provided for this image
In [14]:
#Check for duplicates in training sad images
determineImageDuplicates('Facial_emotion_images/train/sad/')
Duplicate Images:  65
Duplicate: Facial_emotion_images/train/sad/24744.jpg -> Original:Facial_emotion_images/train/sad/12843.jpg
Duplicate: Facial_emotion_images/train/sad/16246.jpg -> Original:Facial_emotion_images/train/sad/24940.jpg
Duplicate: Facial_emotion_images/train/sad/28750.jpg -> Original:Facial_emotion_images/train/sad/28665.jpg
Duplicate: Facial_emotion_images/train/sad/10983.jpg -> Original:Facial_emotion_images/train/sad/24667.jpg
Duplicate: Facial_emotion_images/train/sad/26546.jpg -> Original:Facial_emotion_images/train/sad/19506.jpg
Duplicate: Facial_emotion_images/train/sad/14527.jpg -> Original:Facial_emotion_images/train/sad/34060.jpg
Duplicate: Facial_emotion_images/train/sad/14644.jpg -> Original:Facial_emotion_images/train/sad/31642.jpg
Duplicate: Facial_emotion_images/train/sad/25252.jpg -> Original:Facial_emotion_images/train/sad/16927.jpg
Duplicate: Facial_emotion_images/train/sad/26903.jpg -> Original:Facial_emotion_images/train/sad/27914.jpg
Duplicate: Facial_emotion_images/train/sad/7151.jpg -> Original:Facial_emotion_images/train/sad/15643.jpg
Duplicate: Facial_emotion_images/train/sad/30711.jpg -> Original:Facial_emotion_images/train/sad/31161.jpg
Duplicate: Facial_emotion_images/train/sad/25965.jpg -> Original:Facial_emotion_images/train/sad/25065.jpg
Duplicate: Facial_emotion_images/train/sad/17210.jpg -> Original:Facial_emotion_images/train/sad/34390.jpg
Duplicate: Facial_emotion_images/train/sad/12550.jpg -> Original:Facial_emotion_images/train/sad/7883.jpg
Duplicate: Facial_emotion_images/train/sad/21519.jpg -> Original:Facial_emotion_images/train/sad/24598.jpg
Duplicate: Facial_emotion_images/train/sad/26975.jpg -> Original:Facial_emotion_images/train/sad/16631.jpg
Duplicate: Facial_emotion_images/train/sad/8997.jpg -> Original:Facial_emotion_images/train/sad/18242.jpg
Duplicate: Facial_emotion_images/train/sad/30752.jpg -> Original:Facial_emotion_images/train/sad/12864.jpg
Duplicate: Facial_emotion_images/train/sad/25951.jpg -> Original:Facial_emotion_images/train/sad/33349.jpg
Duplicate: Facial_emotion_images/train/sad/31302.jpg -> Original:Facial_emotion_images/train/sad/19622.jpg
Duplicate: Facial_emotion_images/train/sad/30750.jpg -> Original:Facial_emotion_images/train/sad/12130.jpg
Duplicate: Facial_emotion_images/train/sad/34373.jpg -> Original:Facial_emotion_images/train/sad/26762.jpg
Duplicate: Facial_emotion_images/train/sad/7741.jpg -> Original:Facial_emotion_images/train/sad/18623.jpg
Duplicate: Facial_emotion_images/train/sad/29565.jpg -> Original:Facial_emotion_images/train/sad/16631.jpg
Duplicate: Facial_emotion_images/train/sad/25588.jpg -> Original:Facial_emotion_images/train/sad/8731.jpg
Duplicate: Facial_emotion_images/train/sad/34672.jpg -> Original:Facial_emotion_images/train/sad/35610.jpg
Duplicate: Facial_emotion_images/train/sad/33707.jpg -> Original:Facial_emotion_images/train/sad/24784.jpg
Duplicate: Facial_emotion_images/train/sad/24287.jpg -> Original:Facial_emotion_images/train/sad/27951.jpg
Duplicate: Facial_emotion_images/train/sad/15676.jpg -> Original:Facial_emotion_images/train/sad/11854.jpg
Duplicate: Facial_emotion_images/train/sad/26829.jpg -> Original:Facial_emotion_images/train/sad/30588.jpg
Duplicate: Facial_emotion_images/train/sad/22276.jpg -> Original:Facial_emotion_images/train/sad/16800.jpg
Duplicate: Facial_emotion_images/train/sad/25463.jpg -> Original:Facial_emotion_images/train/sad/26869.jpg
Duplicate: Facial_emotion_images/train/sad/20402.jpg -> Original:Facial_emotion_images/train/sad/27392.jpg
Duplicate: Facial_emotion_images/train/sad/25504.jpg -> Original:Facial_emotion_images/train/sad/14361.jpg
Duplicate: Facial_emotion_images/train/sad/13484.jpg -> Original:Facial_emotion_images/train/sad/15522.jpg
Duplicate: Facial_emotion_images/train/sad/19909.jpg -> Original:Facial_emotion_images/train/sad/10546.jpg
Duplicate: Facial_emotion_images/train/sad/19580.jpg -> Original:Facial_emotion_images/train/sad/20535.jpg
Duplicate: Facial_emotion_images/train/sad/35539.jpg -> Original:Facial_emotion_images/train/sad/16932.jpg
Duplicate: Facial_emotion_images/train/sad/31174.jpg -> Original:Facial_emotion_images/train/sad/32441.jpg
Duplicate: Facial_emotion_images/train/sad/24986.jpg -> Original:Facial_emotion_images/train/sad/32731.jpg
Duplicate: Facial_emotion_images/train/sad/21786.jpg -> Original:Facial_emotion_images/train/sad/29083.jpg
Duplicate: Facial_emotion_images/train/sad/23290.jpg -> Original:Facial_emotion_images/train/sad/33432.jpg
Duplicate: Facial_emotion_images/train/sad/10844.jpg -> Original:Facial_emotion_images/train/sad/16549.jpg
Duplicate: Facial_emotion_images/train/sad/24140.jpg -> Original:Facial_emotion_images/train/sad/7556.jpg
Duplicate: Facial_emotion_images/train/sad/31220.jpg -> Original:Facial_emotion_images/train/sad/32731.jpg
Duplicate: Facial_emotion_images/train/sad/19249.jpg -> Original:Facial_emotion_images/train/sad/19736.jpg
Duplicate: Facial_emotion_images/train/sad/14769.jpg -> Original:Facial_emotion_images/train/sad/27403.jpg
Duplicate: Facial_emotion_images/train/sad/22730.jpg -> Original:Facial_emotion_images/train/sad/12919.jpg
Duplicate: Facial_emotion_images/train/sad/8865.jpg -> Original:Facial_emotion_images/train/sad/30958.jpg
Duplicate: Facial_emotion_images/train/sad/15371.jpg -> Original:Facial_emotion_images/train/sad/26369.jpg
Duplicate: Facial_emotion_images/train/sad/10753.jpg -> Original:Facial_emotion_images/train/sad/17415.jpg
Duplicate: Facial_emotion_images/train/sad/18330.jpg -> Original:Facial_emotion_images/train/sad/25315.jpg
Duplicate: Facial_emotion_images/train/sad/12946.jpg -> Original:Facial_emotion_images/train/sad/13525.jpg
Duplicate: Facial_emotion_images/train/sad/29765.jpg -> Original:Facial_emotion_images/train/sad/24011.jpg
Duplicate: Facial_emotion_images/train/sad/31459.jpg -> Original:Facial_emotion_images/train/sad/7412.jpg
Duplicate: Facial_emotion_images/train/sad/29350.jpg -> Original:Facial_emotion_images/train/sad/13674.jpg
Duplicate: Facial_emotion_images/train/sad/20362.jpg -> Original:Facial_emotion_images/train/sad/15094.jpg
Duplicate: Facial_emotion_images/train/sad/24698.jpg -> Original:Facial_emotion_images/train/sad/27495.jpg
Duplicate: Facial_emotion_images/train/sad/29188.jpg -> Original:Facial_emotion_images/train/sad/10487.jpg
Duplicate: Facial_emotion_images/train/sad/32091.jpg -> Original:Facial_emotion_images/train/sad/25065.jpg
Duplicate: Facial_emotion_images/train/sad/25860.jpg -> Original:Facial_emotion_images/train/sad/16859.jpg
Duplicate: Facial_emotion_images/train/sad/33778.jpg -> Original:Facial_emotion_images/train/sad/10416.jpg
Duplicate: Facial_emotion_images/train/sad/17398.jpg -> Original:Facial_emotion_images/train/sad/16278.jpg
Duplicate: Facial_emotion_images/train/sad/7602.jpg -> Original:Facial_emotion_images/train/sad/22861.jpg
Duplicate: Facial_emotion_images/train/sad/29594.jpg -> Original:Facial_emotion_images/train/sad/22398.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/train/sad/24744.jpg -> Original:Facial_emotion_images/train/sad/12843.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/sad/16246.jpg -> Original:Facial_emotion_images/train/sad/24940.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/sad/28750.jpg -> Original:Facial_emotion_images/train/sad/28665.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/sad/10983.jpg -> Original:Facial_emotion_images/train/sad/24667.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/sad/26546.jpg -> Original:Facial_emotion_images/train/sad/19506.jpg
No description has been provided for this image
In [15]:
#Check for duplicates in training neutral images
determineImageDuplicates('Facial_emotion_images/train/neutral/')
Duplicate Images:  69
Duplicate: Facial_emotion_images/train/neutral/33041.jpg -> Original:Facial_emotion_images/train/neutral/30559.jpg
Duplicate: Facial_emotion_images/train/neutral/19628.jpg -> Original:Facial_emotion_images/train/neutral/12068.jpg
Duplicate: Facial_emotion_images/train/neutral/21448.jpg -> Original:Facial_emotion_images/train/neutral/30157.jpg
Duplicate: Facial_emotion_images/train/neutral/13994.jpg -> Original:Facial_emotion_images/train/neutral/10323.jpg
Duplicate: Facial_emotion_images/train/neutral/24722.jpg -> Original:Facial_emotion_images/train/neutral/18696.jpg
Duplicate: Facial_emotion_images/train/neutral/13017.jpg -> Original:Facial_emotion_images/train/neutral/16677.jpg
Duplicate: Facial_emotion_images/train/neutral/29666.jpg -> Original:Facial_emotion_images/train/neutral/21307.jpg
Duplicate: Facial_emotion_images/train/neutral/13931.jpg -> Original:Facial_emotion_images/train/neutral/18594.jpg
Duplicate: Facial_emotion_images/train/neutral/8181.jpg -> Original:Facial_emotion_images/train/neutral/27330.jpg
Duplicate: Facial_emotion_images/train/neutral/31073.jpg -> Original:Facial_emotion_images/train/neutral/34915.jpg
Duplicate: Facial_emotion_images/train/neutral/31059.jpg -> Original:Facial_emotion_images/train/neutral/34529.jpg
Duplicate: Facial_emotion_images/train/neutral/11531.jpg -> Original:Facial_emotion_images/train/neutral/20345.jpg
Duplicate: Facial_emotion_images/train/neutral/13140.jpg -> Original:Facial_emotion_images/train/neutral/23367.jpg
Duplicate: Facial_emotion_images/train/neutral/27219.jpg -> Original:Facial_emotion_images/train/neutral/35679.jpg
Duplicate: Facial_emotion_images/train/neutral/18697.jpg -> Original:Facial_emotion_images/train/neutral/34422.jpg
Duplicate: Facial_emotion_images/train/neutral/34183.jpg -> Original:Facial_emotion_images/train/neutral/15830.jpg
Duplicate: Facial_emotion_images/train/neutral/20874.jpg -> Original:Facial_emotion_images/train/neutral/26887.jpg
Duplicate: Facial_emotion_images/train/neutral/35442.jpg -> Original:Facial_emotion_images/train/neutral/24242.jpg
Duplicate: Facial_emotion_images/train/neutral/12325.jpg -> Original:Facial_emotion_images/train/neutral/26570.jpg
Duplicate: Facial_emotion_images/train/neutral/30561.jpg -> Original:Facial_emotion_images/train/neutral/21551.jpg
Duplicate: Facial_emotion_images/train/neutral/20797.jpg -> Original:Facial_emotion_images/train/neutral/16474.jpg
Duplicate: Facial_emotion_images/train/neutral/32313.jpg -> Original:Facial_emotion_images/train/neutral/30110.jpg
Duplicate: Facial_emotion_images/train/neutral/33404.jpg -> Original:Facial_emotion_images/train/neutral/24036.jpg
Duplicate: Facial_emotion_images/train/neutral/21871.jpg -> Original:Facial_emotion_images/train/neutral/13347.jpg
Duplicate: Facial_emotion_images/train/neutral/33428.jpg -> Original:Facial_emotion_images/train/neutral/31685.jpg
Duplicate: Facial_emotion_images/train/neutral/33901.jpg -> Original:Facial_emotion_images/train/neutral/28175.jpg
Duplicate: Facial_emotion_images/train/neutral/9262.jpg -> Original:Facial_emotion_images/train/neutral/28799.jpg
Duplicate: Facial_emotion_images/train/neutral/22229.jpg -> Original:Facial_emotion_images/train/neutral/11963.jpg
Duplicate: Facial_emotion_images/train/neutral/10612.jpg -> Original:Facial_emotion_images/train/neutral/15446.jpg
Duplicate: Facial_emotion_images/train/neutral/14019.jpg -> Original:Facial_emotion_images/train/neutral/8894.jpg
Duplicate: Facial_emotion_images/train/neutral/33503.jpg -> Original:Facial_emotion_images/train/neutral/21307.jpg
Duplicate: Facial_emotion_images/train/neutral/10523.jpg -> Original:Facial_emotion_images/train/neutral/32090.jpg
Duplicate: Facial_emotion_images/train/neutral/12165.jpg -> Original:Facial_emotion_images/train/neutral/26395.jpg
Duplicate: Facial_emotion_images/train/neutral/16118.jpg -> Original:Facial_emotion_images/train/neutral/12087.jpg
Duplicate: Facial_emotion_images/train/neutral/17073.jpg -> Original:Facial_emotion_images/train/neutral/30547.jpg
Duplicate: Facial_emotion_images/train/neutral/25758.jpg -> Original:Facial_emotion_images/train/neutral/23919.jpg
Duplicate: Facial_emotion_images/train/neutral/31318.jpg -> Original:Facial_emotion_images/train/neutral/9039.jpg
Duplicate: Facial_emotion_images/train/neutral/27159.jpg -> Original:Facial_emotion_images/train/neutral/22578.jpg
Duplicate: Facial_emotion_images/train/neutral/17409.jpg -> Original:Facial_emotion_images/train/neutral/7515.jpg
Duplicate: Facial_emotion_images/train/neutral/12740.jpg -> Original:Facial_emotion_images/train/neutral/33403.jpg
Duplicate: Facial_emotion_images/train/neutral/14573.jpg -> Original:Facial_emotion_images/train/neutral/27551.jpg
Duplicate: Facial_emotion_images/train/neutral/23928.jpg -> Original:Facial_emotion_images/train/neutral/28699.jpg
Duplicate: Facial_emotion_images/train/neutral/22352.jpg -> Original:Facial_emotion_images/train/neutral/26887.jpg
Duplicate: Facial_emotion_images/train/neutral/30457.jpg -> Original:Facial_emotion_images/train/neutral/16400.jpg
Duplicate: Facial_emotion_images/train/neutral/16427.jpg -> Original:Facial_emotion_images/train/neutral/29198.jpg
Duplicate: Facial_emotion_images/train/neutral/33724.jpg -> Original:Facial_emotion_images/train/neutral/22742.jpg
Duplicate: Facial_emotion_images/train/neutral/11148.jpg -> Original:Facial_emotion_images/train/neutral/24635.jpg
Duplicate: Facial_emotion_images/train/neutral/19886.jpg -> Original:Facial_emotion_images/train/neutral/8090.jpg
Duplicate: Facial_emotion_images/train/neutral/30515.jpg -> Original:Facial_emotion_images/train/neutral/29209.jpg
Duplicate: Facial_emotion_images/train/neutral/19994.jpg -> Original:Facial_emotion_images/train/neutral/19042.jpg
Duplicate: Facial_emotion_images/train/neutral/32435.jpg -> Original:Facial_emotion_images/train/neutral/12087.jpg
Duplicate: Facial_emotion_images/train/neutral/34603.jpg -> Original:Facial_emotion_images/train/neutral/13132.jpg
Duplicate: Facial_emotion_images/train/neutral/34123.jpg -> Original:Facial_emotion_images/train/neutral/12009.jpg
Duplicate: Facial_emotion_images/train/neutral/32213.jpg -> Original:Facial_emotion_images/train/neutral/26774.jpg
Duplicate: Facial_emotion_images/train/neutral/31832.jpg -> Original:Facial_emotion_images/train/neutral/32191.jpg
Duplicate: Facial_emotion_images/train/neutral/32449.jpg -> Original:Facial_emotion_images/train/neutral/23187.jpg
Duplicate: Facial_emotion_images/train/neutral/9998.jpg -> Original:Facial_emotion_images/train/neutral/22564.jpg
Duplicate: Facial_emotion_images/train/neutral/30287.jpg -> Original:Facial_emotion_images/train/neutral/22054.jpg
Duplicate: Facial_emotion_images/train/neutral/21986.jpg -> Original:Facial_emotion_images/train/neutral/34682.jpg
Duplicate: Facial_emotion_images/train/neutral/12670.jpg -> Original:Facial_emotion_images/train/neutral/25805.jpg
Duplicate: Facial_emotion_images/train/neutral/21479.jpg -> Original:Facial_emotion_images/train/neutral/7515.jpg
Duplicate: Facial_emotion_images/train/neutral/22507.jpg -> Original:Facial_emotion_images/train/neutral/19253.jpg
Duplicate: Facial_emotion_images/train/neutral/20045.jpg -> Original:Facial_emotion_images/train/neutral/28373.jpg
Duplicate: Facial_emotion_images/train/neutral/9195.jpg -> Original:Facial_emotion_images/train/neutral/13347.jpg
Duplicate: Facial_emotion_images/train/neutral/25952.jpg -> Original:Facial_emotion_images/train/neutral/21357.jpg
Duplicate: Facial_emotion_images/train/neutral/11086.jpg -> Original:Facial_emotion_images/train/neutral/30301.jpg
Duplicate: Facial_emotion_images/train/neutral/26154.jpg -> Original:Facial_emotion_images/train/neutral/16471.jpg
Duplicate: Facial_emotion_images/train/neutral/19635.jpg -> Original:Facial_emotion_images/train/neutral/24316.jpg
Duplicate: Facial_emotion_images/train/neutral/10936.jpg -> Original:Facial_emotion_images/train/neutral/14004.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/train/neutral/33041.jpg -> Original:Facial_emotion_images/train/neutral/30559.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/neutral/19628.jpg -> Original:Facial_emotion_images/train/neutral/12068.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/neutral/21448.jpg -> Original:Facial_emotion_images/train/neutral/30157.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/neutral/13994.jpg -> Original:Facial_emotion_images/train/neutral/10323.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/neutral/24722.jpg -> Original:Facial_emotion_images/train/neutral/18696.jpg
No description has been provided for this image
In [16]:
#Check for duplicates in training surprise images
determineImageDuplicates('Facial_emotion_images/train/surprise/')
Duplicate Images:  498
Duplicate: Facial_emotion_images/train/surprise/22477.jpg -> Original:Facial_emotion_images/train/surprise/35285.jpg
Duplicate: Facial_emotion_images/train/surprise/32716.jpg -> Original:Facial_emotion_images/train/surprise/31671.jpg
Duplicate: Facial_emotion_images/train/surprise/595.jpg -> Original:Facial_emotion_images/train/surprise/32749.jpg
Duplicate: Facial_emotion_images/train/surprise/27071.jpg -> Original:Facial_emotion_images/train/surprise/8979.jpg
Duplicate: Facial_emotion_images/train/surprise/17004.jpg -> Original:Facial_emotion_images/train/surprise/7699.jpg
Duplicate: Facial_emotion_images/train/surprise/11089.jpg -> Original:Facial_emotion_images/train/surprise/27898.jpg
Duplicate: Facial_emotion_images/train/surprise/3781.jpg -> Original:Facial_emotion_images/train/surprise/33825.jpg
Duplicate: Facial_emotion_images/train/surprise/4436.jpg -> Original:Facial_emotion_images/train/surprise/14918.jpg
Duplicate: Facial_emotion_images/train/surprise/7060.jpg -> Original:Facial_emotion_images/train/surprise/25207.jpg
Duplicate: Facial_emotion_images/train/surprise/15770.jpg -> Original:Facial_emotion_images/train/surprise/31671.jpg
Duplicate: Facial_emotion_images/train/surprise/27531.jpg -> Original:Facial_emotion_images/train/surprise/27535.jpg
Duplicate: Facial_emotion_images/train/surprise/34816.jpg -> Original:Facial_emotion_images/train/surprise/24040.jpg
Duplicate: Facial_emotion_images/train/surprise/28662.jpg -> Original:Facial_emotion_images/train/surprise/17540.jpg
Duplicate: Facial_emotion_images/train/surprise/10184.jpg -> Original:Facial_emotion_images/train/surprise/5905.jpg
Duplicate: Facial_emotion_images/train/surprise/9985.jpg -> Original:Facial_emotion_images/train/surprise/34990.jpg
Duplicate: Facial_emotion_images/train/surprise/8079.jpg -> Original:Facial_emotion_images/train/surprise/12176.jpg
Duplicate: Facial_emotion_images/train/surprise/9990.jpg -> Original:Facial_emotion_images/train/surprise/27002.jpg
Duplicate: Facial_emotion_images/train/surprise/28172.jpg -> Original:Facial_emotion_images/train/surprise/30312.jpg
Duplicate: Facial_emotion_images/train/surprise/35164.jpg -> Original:Facial_emotion_images/train/surprise/3971.jpg
Duplicate: Facial_emotion_images/train/surprise/28051.jpg -> Original:Facial_emotion_images/train/surprise/32924.jpg
Duplicate: Facial_emotion_images/train/surprise/2344.jpg -> Original:Facial_emotion_images/train/surprise/24293.jpg
Duplicate: Facial_emotion_images/train/surprise/12745.jpg -> Original:Facial_emotion_images/train/surprise/27002.jpg
Duplicate: Facial_emotion_images/train/surprise/31633.jpg -> Original:Facial_emotion_images/train/surprise/2722.jpg
Duplicate: Facial_emotion_images/train/surprise/6486.jpg -> Original:Facial_emotion_images/train/surprise/34794.jpg
Duplicate: Facial_emotion_images/train/surprise/6936.jpg -> Original:Facial_emotion_images/train/surprise/27002.jpg
Duplicate: Facial_emotion_images/train/surprise/23128.jpg -> Original:Facial_emotion_images/train/surprise/11811.jpg
Duplicate: Facial_emotion_images/train/surprise/6712.jpg -> Original:Facial_emotion_images/train/surprise/4198.jpg
Duplicate: Facial_emotion_images/train/surprise/13565.jpg -> Original:Facial_emotion_images/train/surprise/19222.jpg
Duplicate: Facial_emotion_images/train/surprise/21895.jpg -> Original:Facial_emotion_images/train/surprise/17759.jpg
Duplicate: Facial_emotion_images/train/surprise/10873.jpg -> Original:Facial_emotion_images/train/surprise/33755.jpg
Duplicate: Facial_emotion_images/train/surprise/13033.jpg -> Original:Facial_emotion_images/train/surprise/23254.jpg
Duplicate: Facial_emotion_images/train/surprise/22007.jpg -> Original:Facial_emotion_images/train/surprise/30681.jpg
Duplicate: Facial_emotion_images/train/surprise/5616.jpg -> Original:Facial_emotion_images/train/surprise/13632.jpg
Duplicate: Facial_emotion_images/train/surprise/18764.jpg -> Original:Facial_emotion_images/train/surprise/32214.jpg
Duplicate: Facial_emotion_images/train/surprise/4407.jpg -> Original:Facial_emotion_images/train/surprise/22648.jpg
Duplicate: Facial_emotion_images/train/surprise/21382.jpg -> Original:Facial_emotion_images/train/surprise/18854.jpg
Duplicate: Facial_emotion_images/train/surprise/1157.jpg -> Original:Facial_emotion_images/train/surprise/17586.jpg
Duplicate: Facial_emotion_images/train/surprise/22437.jpg -> Original:Facial_emotion_images/train/surprise/25730.jpg
Duplicate: Facial_emotion_images/train/surprise/8560.jpg -> Original:Facial_emotion_images/train/surprise/14035.jpg
Duplicate: Facial_emotion_images/train/surprise/31348.jpg -> Original:Facial_emotion_images/train/surprise/33042.jpg
Duplicate: Facial_emotion_images/train/surprise/11519.jpg -> Original:Facial_emotion_images/train/surprise/34606.jpg
Duplicate: Facial_emotion_images/train/surprise/18207.jpg -> Original:Facial_emotion_images/train/surprise/18524.jpg
Duplicate: Facial_emotion_images/train/surprise/30873.jpg -> Original:Facial_emotion_images/train/surprise/27830.jpg
Duplicate: Facial_emotion_images/train/surprise/20985.jpg -> Original:Facial_emotion_images/train/surprise/21558.jpg
Duplicate: Facial_emotion_images/train/surprise/26589.jpg -> Original:Facial_emotion_images/train/surprise/19434.jpg
Duplicate: Facial_emotion_images/train/surprise/33886.jpg -> Original:Facial_emotion_images/train/surprise/35388.jpg
Duplicate: Facial_emotion_images/train/surprise/12201.jpg -> Original:Facial_emotion_images/train/surprise/27702.jpg
Duplicate: Facial_emotion_images/train/surprise/8208.jpg -> Original:Facial_emotion_images/train/surprise/27918.jpg
Duplicate: Facial_emotion_images/train/surprise/6847.jpg -> Original:Facial_emotion_images/train/surprise/22648.jpg
Duplicate: Facial_emotion_images/train/surprise/27659.jpg -> Original:Facial_emotion_images/train/surprise/10282.jpg
Duplicate: Facial_emotion_images/train/surprise/7454.jpg -> Original:Facial_emotion_images/train/surprise/22478.jpg
Duplicate: Facial_emotion_images/train/surprise/26999.jpg -> Original:Facial_emotion_images/train/surprise/15681.jpg
Duplicate: Facial_emotion_images/train/surprise/27264.jpg -> Original:Facial_emotion_images/train/surprise/411.jpg
Duplicate: Facial_emotion_images/train/surprise/19691.jpg -> Original:Facial_emotion_images/train/surprise/10505.jpg
Duplicate: Facial_emotion_images/train/surprise/24127.jpg -> Original:Facial_emotion_images/train/surprise/35288.jpg
Duplicate: Facial_emotion_images/train/surprise/24584.jpg -> Original:Facial_emotion_images/train/surprise/12010.jpg
Duplicate: Facial_emotion_images/train/surprise/18370.jpg -> Original:Facial_emotion_images/train/surprise/30567.jpg
Duplicate: Facial_emotion_images/train/surprise/17121.jpg -> Original:Facial_emotion_images/train/surprise/25561.jpg
Duplicate: Facial_emotion_images/train/surprise/6240.jpg -> Original:Facial_emotion_images/train/surprise/1748.jpg
Duplicate: Facial_emotion_images/train/surprise/25222.jpg -> Original:Facial_emotion_images/train/surprise/12908.jpg
Duplicate: Facial_emotion_images/train/surprise/9942.jpg -> Original:Facial_emotion_images/train/surprise/28229.jpg
Duplicate: Facial_emotion_images/train/surprise/19283.jpg -> Original:Facial_emotion_images/train/surprise/2899.jpg
Duplicate: Facial_emotion_images/train/surprise/5365.jpg -> Original:Facial_emotion_images/train/surprise/14805.jpg
Duplicate: Facial_emotion_images/train/surprise/28167.jpg -> Original:Facial_emotion_images/train/surprise/33332.jpg
Duplicate: Facial_emotion_images/train/surprise/20015.jpg -> Original:Facial_emotion_images/train/surprise/2596.jpg
Duplicate: Facial_emotion_images/train/surprise/362.jpg -> Original:Facial_emotion_images/train/surprise/33631.jpg
Duplicate: Facial_emotion_images/train/surprise/8683.jpg -> Original:Facial_emotion_images/train/surprise/6032.jpg
Duplicate: Facial_emotion_images/train/surprise/28905.jpg -> Original:Facial_emotion_images/train/surprise/7699.jpg
Duplicate: Facial_emotion_images/train/surprise/13257.jpg -> Original:Facial_emotion_images/train/surprise/1997.jpg
Duplicate: Facial_emotion_images/train/surprise/21071.jpg -> Original:Facial_emotion_images/train/surprise/3073.jpg
Duplicate: Facial_emotion_images/train/surprise/19830.jpg -> Original:Facial_emotion_images/train/surprise/27123.jpg
Duplicate: Facial_emotion_images/train/surprise/5492.jpg -> Original:Facial_emotion_images/train/surprise/23253.jpg
Duplicate: Facial_emotion_images/train/surprise/33251.jpg -> Original:Facial_emotion_images/train/surprise/4280.jpg
Duplicate: Facial_emotion_images/train/surprise/6588.jpg -> Original:Facial_emotion_images/train/surprise/33755.jpg
Duplicate: Facial_emotion_images/train/surprise/4946.jpg -> Original:Facial_emotion_images/train/surprise/13520.jpg
Duplicate: Facial_emotion_images/train/surprise/33430.jpg -> Original:Facial_emotion_images/train/surprise/14535.jpg
Duplicate: Facial_emotion_images/train/surprise/34016.jpg -> Original:Facial_emotion_images/train/surprise/28229.jpg
Duplicate: Facial_emotion_images/train/surprise/21123.jpg -> Original:Facial_emotion_images/train/surprise/19978.jpg
Duplicate: Facial_emotion_images/train/surprise/4375.jpg -> Original:Facial_emotion_images/train/surprise/31902.jpg
Duplicate: Facial_emotion_images/train/surprise/11047.jpg -> Original:Facial_emotion_images/train/surprise/24483.jpg
Duplicate: Facial_emotion_images/train/surprise/30630.jpg -> Original:Facial_emotion_images/train/surprise/20776.jpg
Duplicate: Facial_emotion_images/train/surprise/19781.jpg -> Original:Facial_emotion_images/train/surprise/19203.jpg
Duplicate: Facial_emotion_images/train/surprise/2188.jpg -> Original:Facial_emotion_images/train/surprise/6533.jpg
Duplicate: Facial_emotion_images/train/surprise/32611.jpg -> Original:Facial_emotion_images/train/surprise/10282.jpg
Duplicate: Facial_emotion_images/train/surprise/2883.jpg -> Original:Facial_emotion_images/train/surprise/17738.jpg
Duplicate: Facial_emotion_images/train/surprise/11119.jpg -> Original:Facial_emotion_images/train/surprise/5393.jpg
Duplicate: Facial_emotion_images/train/surprise/35174.jpg -> Original:Facial_emotion_images/train/surprise/27147.jpg
Duplicate: Facial_emotion_images/train/surprise/14926.jpg -> Original:Facial_emotion_images/train/surprise/1792.jpg
Duplicate: Facial_emotion_images/train/surprise/8895.jpg -> Original:Facial_emotion_images/train/surprise/6199.jpg
Duplicate: Facial_emotion_images/train/surprise/17825.jpg -> Original:Facial_emotion_images/train/surprise/2596.jpg
Duplicate: Facial_emotion_images/train/surprise/18730.jpg -> Original:Facial_emotion_images/train/surprise/20484.jpg
Duplicate: Facial_emotion_images/train/surprise/1430.jpg -> Original:Facial_emotion_images/train/surprise/4044.jpg
Duplicate: Facial_emotion_images/train/surprise/4251.jpg -> Original:Facial_emotion_images/train/surprise/18508.jpg
Duplicate: Facial_emotion_images/train/surprise/8715.jpg -> Original:Facial_emotion_images/train/surprise/30300.jpg
Duplicate: Facial_emotion_images/train/surprise/26029.jpg -> Original:Facial_emotion_images/train/surprise/10411.jpg
Duplicate: Facial_emotion_images/train/surprise/32985.jpg -> Original:Facial_emotion_images/train/surprise/21141.jpg
Duplicate: Facial_emotion_images/train/surprise/12195.jpg -> Original:Facial_emotion_images/train/surprise/20003.jpg
Duplicate: Facial_emotion_images/train/surprise/23378.jpg -> Original:Facial_emotion_images/train/surprise/1327.jpg
Duplicate: Facial_emotion_images/train/surprise/33500.jpg -> Original:Facial_emotion_images/train/surprise/12176.jpg
Duplicate: Facial_emotion_images/train/surprise/34647.jpg -> Original:Facial_emotion_images/train/surprise/9996.jpg
Duplicate: Facial_emotion_images/train/surprise/3928.jpg -> Original:Facial_emotion_images/train/surprise/23003.jpg
Duplicate: Facial_emotion_images/train/surprise/18229.jpg -> Original:Facial_emotion_images/train/surprise/25207.jpg
Duplicate: Facial_emotion_images/train/surprise/31199.jpg -> Original:Facial_emotion_images/train/surprise/26403.jpg
Duplicate: Facial_emotion_images/train/surprise/11279.jpg -> Original:Facial_emotion_images/train/surprise/4915.jpg
Duplicate: Facial_emotion_images/train/surprise/26735.jpg -> Original:Facial_emotion_images/train/surprise/15602.jpg
Duplicate: Facial_emotion_images/train/surprise/15199.jpg -> Original:Facial_emotion_images/train/surprise/18175.jpg
Duplicate: Facial_emotion_images/train/surprise/2908.jpg -> Original:Facial_emotion_images/train/surprise/22310.jpg
Duplicate: Facial_emotion_images/train/surprise/25852.jpg -> Original:Facial_emotion_images/train/surprise/24620.jpg
Duplicate: Facial_emotion_images/train/surprise/7476.jpg -> Original:Facial_emotion_images/train/surprise/12605.jpg
Duplicate: Facial_emotion_images/train/surprise/18125.jpg -> Original:Facial_emotion_images/train/surprise/27290.jpg
Duplicate: Facial_emotion_images/train/surprise/22982.jpg -> Original:Facial_emotion_images/train/surprise/10602.jpg
Duplicate: Facial_emotion_images/train/surprise/30929.jpg -> Original:Facial_emotion_images/train/surprise/4915.jpg
Duplicate: Facial_emotion_images/train/surprise/30037.jpg -> Original:Facial_emotion_images/train/surprise/1278.jpg
Duplicate: Facial_emotion_images/train/surprise/21781.jpg -> Original:Facial_emotion_images/train/surprise/2352.jpg
Duplicate: Facial_emotion_images/train/surprise/25178.jpg -> Original:Facial_emotion_images/train/surprise/27592.jpg
Duplicate: Facial_emotion_images/train/surprise/29533.jpg -> Original:Facial_emotion_images/train/surprise/8950.jpg
Duplicate: Facial_emotion_images/train/surprise/5696.jpg -> Original:Facial_emotion_images/train/surprise/7780.jpg
Duplicate: Facial_emotion_images/train/surprise/6357.jpg -> Original:Facial_emotion_images/train/surprise/29829.jpg
Duplicate: Facial_emotion_images/train/surprise/18620.jpg -> Original:Facial_emotion_images/train/surprise/8084.jpg
Duplicate: Facial_emotion_images/train/surprise/5294.jpg -> Original:Facial_emotion_images/train/surprise/14552.jpg
Duplicate: Facial_emotion_images/train/surprise/15747.jpg -> Original:Facial_emotion_images/train/surprise/20244.jpg
Duplicate: Facial_emotion_images/train/surprise/19915.jpg -> Original:Facial_emotion_images/train/surprise/11407.jpg
Duplicate: Facial_emotion_images/train/surprise/12918.jpg -> Original:Facial_emotion_images/train/surprise/16070.jpg
Duplicate: Facial_emotion_images/train/surprise/8324.jpg -> Original:Facial_emotion_images/train/surprise/14207.jpg
Duplicate: Facial_emotion_images/train/surprise/32780.jpg -> Original:Facial_emotion_images/train/surprise/5948.jpg
Duplicate: Facial_emotion_images/train/surprise/14001.jpg -> Original:Facial_emotion_images/train/surprise/2736.jpg
Duplicate: Facial_emotion_images/train/surprise/31978.jpg -> Original:Facial_emotion_images/train/surprise/13018.jpg
Duplicate: Facial_emotion_images/train/surprise/22369.jpg -> Original:Facial_emotion_images/train/surprise/27492.jpg
Duplicate: Facial_emotion_images/train/surprise/2259.jpg -> Original:Facial_emotion_images/train/surprise/23724.jpg
Duplicate: Facial_emotion_images/train/surprise/26362.jpg -> Original:Facial_emotion_images/train/surprise/15309.jpg
Duplicate: Facial_emotion_images/train/surprise/12385.jpg -> Original:Facial_emotion_images/train/surprise/27853.jpg
Duplicate: Facial_emotion_images/train/surprise/32004.jpg -> Original:Facial_emotion_images/train/surprise/23181.jpg
Duplicate: Facial_emotion_images/train/surprise/8055.jpg -> Original:Facial_emotion_images/train/surprise/16451.jpg
Duplicate: Facial_emotion_images/train/surprise/6594.jpg -> Original:Facial_emotion_images/train/surprise/7977.jpg
Duplicate: Facial_emotion_images/train/surprise/19482.jpg -> Original:Facial_emotion_images/train/surprise/26880.jpg
Duplicate: Facial_emotion_images/train/surprise/24502.jpg -> Original:Facial_emotion_images/train/surprise/22529.jpg
Duplicate: Facial_emotion_images/train/surprise/33596.jpg -> Original:Facial_emotion_images/train/surprise/9198.jpg
Duplicate: Facial_emotion_images/train/surprise/4630.jpg -> Original:Facial_emotion_images/train/surprise/1042.jpg
Duplicate: Facial_emotion_images/train/surprise/27211.jpg -> Original:Facial_emotion_images/train/surprise/28504.jpg
Duplicate: Facial_emotion_images/train/surprise/32774.jpg -> Original:Facial_emotion_images/train/surprise/23202.jpg
Duplicate: Facial_emotion_images/train/surprise/6411.jpg -> Original:Facial_emotion_images/train/surprise/4915.jpg
Duplicate: Facial_emotion_images/train/surprise/30142.jpg -> Original:Facial_emotion_images/train/surprise/29600.jpg
Duplicate: Facial_emotion_images/train/surprise/1145.jpg -> Original:Facial_emotion_images/train/surprise/909.jpg
Duplicate: Facial_emotion_images/train/surprise/35750.jpg -> Original:Facial_emotion_images/train/surprise/27002.jpg
Duplicate: Facial_emotion_images/train/surprise/8132.jpg -> Original:Facial_emotion_images/train/surprise/1977.jpg
Duplicate: Facial_emotion_images/train/surprise/30876.jpg -> Original:Facial_emotion_images/train/surprise/1999.jpg
Duplicate: Facial_emotion_images/train/surprise/17478.jpg -> Original:Facial_emotion_images/train/surprise/1327.jpg
Duplicate: Facial_emotion_images/train/surprise/26824.jpg -> Original:Facial_emotion_images/train/surprise/1467.jpg
Duplicate: Facial_emotion_images/train/surprise/23376.jpg -> Original:Facial_emotion_images/train/surprise/8167.jpg
Duplicate: Facial_emotion_images/train/surprise/23268.jpg -> Original:Facial_emotion_images/train/surprise/16618.jpg
Duplicate: Facial_emotion_images/train/surprise/21522.jpg -> Original:Facial_emotion_images/train/surprise/17540.jpg
Duplicate: Facial_emotion_images/train/surprise/20139.jpg -> Original:Facial_emotion_images/train/surprise/3343.jpg
Duplicate: Facial_emotion_images/train/surprise/8698.jpg -> Original:Facial_emotion_images/train/surprise/8656.jpg
Duplicate: Facial_emotion_images/train/surprise/18845.jpg -> Original:Facial_emotion_images/train/surprise/35087.jpg
Duplicate: Facial_emotion_images/train/surprise/10061.jpg -> Original:Facial_emotion_images/train/surprise/1028.jpg
Duplicate: Facial_emotion_images/train/surprise/26427.jpg -> Original:Facial_emotion_images/train/surprise/4739.jpg
Duplicate: Facial_emotion_images/train/surprise/26444.jpg -> Original:Facial_emotion_images/train/surprise/1792.jpg
Duplicate: Facial_emotion_images/train/surprise/11027.jpg -> Original:Facial_emotion_images/train/surprise/8640.jpg
Duplicate: Facial_emotion_images/train/surprise/30725.jpg -> Original:Facial_emotion_images/train/surprise/392.jpg
Duplicate: Facial_emotion_images/train/surprise/9036.jpg -> Original:Facial_emotion_images/train/surprise/12605.jpg
Duplicate: Facial_emotion_images/train/surprise/20764.jpg -> Original:Facial_emotion_images/train/surprise/9271.jpg
Duplicate: Facial_emotion_images/train/surprise/28283.jpg -> Original:Facial_emotion_images/train/surprise/14720.jpg
Duplicate: Facial_emotion_images/train/surprise/34743.jpg -> Original:Facial_emotion_images/train/surprise/4915.jpg
Duplicate: Facial_emotion_images/train/surprise/5456.jpg -> Original:Facial_emotion_images/train/surprise/789.jpg
Duplicate: Facial_emotion_images/train/surprise/8869.jpg -> Original:Facial_emotion_images/train/surprise/4344.jpg
Duplicate: Facial_emotion_images/train/surprise/357.jpg -> Original:Facial_emotion_images/train/surprise/6670.jpg
Duplicate: Facial_emotion_images/train/surprise/33746.jpg -> Original:Facial_emotion_images/train/surprise/27782.jpg
Duplicate: Facial_emotion_images/train/surprise/32988.jpg -> Original:Facial_emotion_images/train/surprise/18509.jpg
Duplicate: Facial_emotion_images/train/surprise/24599.jpg -> Original:Facial_emotion_images/train/surprise/26488.jpg
Duplicate: Facial_emotion_images/train/surprise/4330.jpg -> Original:Facial_emotion_images/train/surprise/10282.jpg
Duplicate: Facial_emotion_images/train/surprise/964.jpg -> Original:Facial_emotion_images/train/surprise/10333.jpg
Duplicate: Facial_emotion_images/train/surprise/14177.jpg -> Original:Facial_emotion_images/train/surprise/13023.jpg
Duplicate: Facial_emotion_images/train/surprise/21924.jpg -> Original:Facial_emotion_images/train/surprise/27164.jpg
Duplicate: Facial_emotion_images/train/surprise/9801.jpg -> Original:Facial_emotion_images/train/surprise/22947.jpg
Duplicate: Facial_emotion_images/train/surprise/22393.jpg -> Original:Facial_emotion_images/train/surprise/1327.jpg
Duplicate: Facial_emotion_images/train/surprise/35130.jpg -> Original:Facial_emotion_images/train/surprise/3971.jpg
Duplicate: Facial_emotion_images/train/surprise/11111.jpg -> Original:Facial_emotion_images/train/surprise/34706.jpg
Duplicate: Facial_emotion_images/train/surprise/23692.jpg -> Original:Facial_emotion_images/train/surprise/35874.jpg
Duplicate: Facial_emotion_images/train/surprise/23796.jpg -> Original:Facial_emotion_images/train/surprise/13023.jpg
Duplicate: Facial_emotion_images/train/surprise/20774.jpg -> Original:Facial_emotion_images/train/surprise/30008.jpg
Duplicate: Facial_emotion_images/train/surprise/33484.jpg -> Original:Facial_emotion_images/train/surprise/35798.jpg
Duplicate: Facial_emotion_images/train/surprise/22263.jpg -> Original:Facial_emotion_images/train/surprise/16020.jpg
Duplicate: Facial_emotion_images/train/surprise/2351.jpg -> Original:Facial_emotion_images/train/surprise/7309.jpg
Duplicate: Facial_emotion_images/train/surprise/21129.jpg -> Original:Facial_emotion_images/train/surprise/11496.jpg
Duplicate: Facial_emotion_images/train/surprise/4461.jpg -> Original:Facial_emotion_images/train/surprise/1327.jpg
Duplicate: Facial_emotion_images/train/surprise/6676.jpg -> Original:Facial_emotion_images/train/surprise/6685.jpg
Duplicate: Facial_emotion_images/train/surprise/27490.jpg -> Original:Facial_emotion_images/train/surprise/22680.jpg
Duplicate: Facial_emotion_images/train/surprise/10410.jpg -> Original:Facial_emotion_images/train/surprise/30243.jpg
Duplicate: Facial_emotion_images/train/surprise/22812.jpg -> Original:Facial_emotion_images/train/surprise/11372.jpg
Duplicate: Facial_emotion_images/train/surprise/26874.jpg -> Original:Facial_emotion_images/train/surprise/21780.jpg
Duplicate: Facial_emotion_images/train/surprise/21727.jpg -> Original:Facial_emotion_images/train/surprise/24835.jpg
Duplicate: Facial_emotion_images/train/surprise/11633.jpg -> Original:Facial_emotion_images/train/surprise/34411.jpg
Duplicate: Facial_emotion_images/train/surprise/25353.jpg -> Original:Facial_emotion_images/train/surprise/23724.jpg
Duplicate: Facial_emotion_images/train/surprise/1824.jpg -> Original:Facial_emotion_images/train/surprise/1289.jpg
Duplicate: Facial_emotion_images/train/surprise/4426.jpg -> Original:Facial_emotion_images/train/surprise/12176.jpg
Duplicate: Facial_emotion_images/train/surprise/31512.jpg -> Original:Facial_emotion_images/train/surprise/21975.jpg
Duplicate: Facial_emotion_images/train/surprise/25466.jpg -> Original:Facial_emotion_images/train/surprise/34583.jpg
Duplicate: Facial_emotion_images/train/surprise/16162.jpg -> Original:Facial_emotion_images/train/surprise/24483.jpg
Duplicate: Facial_emotion_images/train/surprise/23843.jpg -> Original:Facial_emotion_images/train/surprise/28504.jpg
Duplicate: Facial_emotion_images/train/surprise/18437.jpg -> Original:Facial_emotion_images/train/surprise/8219.jpg
Duplicate: Facial_emotion_images/train/surprise/2968.jpg -> Original:Facial_emotion_images/train/surprise/9749.jpg
Duplicate: Facial_emotion_images/train/surprise/20924.jpg -> Original:Facial_emotion_images/train/surprise/17716.jpg
Duplicate: Facial_emotion_images/train/surprise/24215.jpg -> Original:Facial_emotion_images/train/surprise/13980.jpg
Duplicate: Facial_emotion_images/train/surprise/26349.jpg -> Original:Facial_emotion_images/train/surprise/7851.jpg
Duplicate: Facial_emotion_images/train/surprise/15813.jpg -> Original:Facial_emotion_images/train/surprise/15166.jpg
Duplicate: Facial_emotion_images/train/surprise/4012.jpg -> Original:Facial_emotion_images/train/surprise/17138.jpg
Duplicate: Facial_emotion_images/train/surprise/1201.jpg -> Original:Facial_emotion_images/train/surprise/9784.jpg
Duplicate: Facial_emotion_images/train/surprise/13131.jpg -> Original:Facial_emotion_images/train/surprise/21780.jpg
Duplicate: Facial_emotion_images/train/surprise/29368.jpg -> Original:Facial_emotion_images/train/surprise/31787.jpg
Duplicate: Facial_emotion_images/train/surprise/9789.jpg -> Original:Facial_emotion_images/train/surprise/25816.jpg
Duplicate: Facial_emotion_images/train/surprise/15545.jpg -> Original:Facial_emotion_images/train/surprise/6564.jpg
Duplicate: Facial_emotion_images/train/surprise/24816.jpg -> Original:Facial_emotion_images/train/surprise/14814.jpg
Duplicate: Facial_emotion_images/train/surprise/7610.jpg -> Original:Facial_emotion_images/train/surprise/15639.jpg
Duplicate: Facial_emotion_images/train/surprise/6773.jpg -> Original:Facial_emotion_images/train/surprise/9924.jpg
Duplicate: Facial_emotion_images/train/surprise/15259.jpg -> Original:Facial_emotion_images/train/surprise/30300.jpg
Duplicate: Facial_emotion_images/train/surprise/1232.jpg -> Original:Facial_emotion_images/train/surprise/24171.jpg
Duplicate: Facial_emotion_images/train/surprise/32484.jpg -> Original:Facial_emotion_images/train/surprise/21642.jpg
Duplicate: Facial_emotion_images/train/surprise/25776.jpg -> Original:Facial_emotion_images/train/surprise/34499.jpg
Duplicate: Facial_emotion_images/train/surprise/7431.jpg -> Original:Facial_emotion_images/train/surprise/13303.jpg
Duplicate: Facial_emotion_images/train/surprise/7315.jpg -> Original:Facial_emotion_images/train/surprise/17540.jpg
Duplicate: Facial_emotion_images/train/surprise/11393.jpg -> Original:Facial_emotion_images/train/surprise/30935.jpg
Duplicate: Facial_emotion_images/train/surprise/24793.jpg -> Original:Facial_emotion_images/train/surprise/22901.jpg
Duplicate: Facial_emotion_images/train/surprise/19660.jpg -> Original:Facial_emotion_images/train/surprise/24730.jpg
Duplicate: Facial_emotion_images/train/surprise/33385.jpg -> Original:Facial_emotion_images/train/surprise/7483.jpg
Duplicate: Facial_emotion_images/train/surprise/29833.jpg -> Original:Facial_emotion_images/train/surprise/11374.jpg
Duplicate: Facial_emotion_images/train/surprise/28065.jpg -> Original:Facial_emotion_images/train/surprise/32376.jpg
Duplicate: Facial_emotion_images/train/surprise/16326.jpg -> Original:Facial_emotion_images/train/surprise/8328.jpg
Duplicate: Facial_emotion_images/train/surprise/17317.jpg -> Original:Facial_emotion_images/train/surprise/17461.jpg
Duplicate: Facial_emotion_images/train/surprise/21768.jpg -> Original:Facial_emotion_images/train/surprise/17937.jpg
Duplicate: Facial_emotion_images/train/surprise/3060.jpg -> Original:Facial_emotion_images/train/surprise/27906.jpg
Duplicate: Facial_emotion_images/train/surprise/21821.jpg -> Original:Facial_emotion_images/train/surprise/26135.jpg
Duplicate: Facial_emotion_images/train/surprise/3569.jpg -> Original:Facial_emotion_images/train/surprise/23724.jpg
Duplicate: Facial_emotion_images/train/surprise/29271.jpg -> Original:Facial_emotion_images/train/surprise/20864.jpg
Duplicate: Facial_emotion_images/train/surprise/15461.jpg -> Original:Facial_emotion_images/train/surprise/28935.jpg
Duplicate: Facial_emotion_images/train/surprise/31998.jpg -> Original:Facial_emotion_images/train/surprise/13767.jpg
Duplicate: Facial_emotion_images/train/surprise/15607.jpg -> Original:Facial_emotion_images/train/surprise/28475.jpg
Duplicate: Facial_emotion_images/train/surprise/25488.jpg -> Original:Facial_emotion_images/train/surprise/20311.jpg
Duplicate: Facial_emotion_images/train/surprise/10963.jpg -> Original:Facial_emotion_images/train/surprise/28306.jpg
Duplicate: Facial_emotion_images/train/surprise/28671.jpg -> Original:Facial_emotion_images/train/surprise/16637.jpg
Duplicate: Facial_emotion_images/train/surprise/20512.jpg -> Original:Facial_emotion_images/train/surprise/3897.jpg
Duplicate: Facial_emotion_images/train/surprise/17806.jpg -> Original:Facial_emotion_images/train/surprise/17894.jpg
Duplicate: Facial_emotion_images/train/surprise/2755.jpg -> Original:Facial_emotion_images/train/surprise/1359.jpg
Duplicate: Facial_emotion_images/train/surprise/31550.jpg -> Original:Facial_emotion_images/train/surprise/19519.jpg
Duplicate: Facial_emotion_images/train/surprise/30790.jpg -> Original:Facial_emotion_images/train/surprise/14341.jpg
Duplicate: Facial_emotion_images/train/surprise/1379.jpg -> Original:Facial_emotion_images/train/surprise/33650.jpg
Duplicate: Facial_emotion_images/train/surprise/35211.jpg -> Original:Facial_emotion_images/train/surprise/17677.jpg
Duplicate: Facial_emotion_images/train/surprise/21346.jpg -> Original:Facial_emotion_images/train/surprise/13827.jpg
Duplicate: Facial_emotion_images/train/surprise/9787.jpg -> Original:Facial_emotion_images/train/surprise/23806.jpg
Duplicate: Facial_emotion_images/train/surprise/5941.jpg -> Original:Facial_emotion_images/train/surprise/12473.jpg
Duplicate: Facial_emotion_images/train/surprise/20955.jpg -> Original:Facial_emotion_images/train/surprise/34330.jpg
Duplicate: Facial_emotion_images/train/surprise/14615.jpg -> Original:Facial_emotion_images/train/surprise/21141.jpg
Duplicate: Facial_emotion_images/train/surprise/15808.jpg -> Original:Facial_emotion_images/train/surprise/15754.jpg
Duplicate: Facial_emotion_images/train/surprise/16669.jpg -> Original:Facial_emotion_images/train/surprise/1719.jpg
Duplicate: Facial_emotion_images/train/surprise/24589.jpg -> Original:Facial_emotion_images/train/surprise/4332.jpg
Duplicate: Facial_emotion_images/train/surprise/32176.jpg -> Original:Facial_emotion_images/train/surprise/13529.jpg
Duplicate: Facial_emotion_images/train/surprise/30427.jpg -> Original:Facial_emotion_images/train/surprise/21411.jpg
Duplicate: Facial_emotion_images/train/surprise/18891.jpg -> Original:Facial_emotion_images/train/surprise/30681.jpg
Duplicate: Facial_emotion_images/train/surprise/14844.jpg -> Original:Facial_emotion_images/train/surprise/24083.jpg
Duplicate: Facial_emotion_images/train/surprise/16543.jpg -> Original:Facial_emotion_images/train/surprise/28063.jpg
Duplicate: Facial_emotion_images/train/surprise/20310.jpg -> Original:Facial_emotion_images/train/surprise/4462.jpg
Duplicate: Facial_emotion_images/train/surprise/30596.jpg -> Original:Facial_emotion_images/train/surprise/26010.jpg
Duplicate: Facial_emotion_images/train/surprise/19733.jpg -> Original:Facial_emotion_images/train/surprise/16199.jpg
Duplicate: Facial_emotion_images/train/surprise/28603.jpg -> Original:Facial_emotion_images/train/surprise/13689.jpg
Duplicate: Facial_emotion_images/train/surprise/5481.jpg -> Original:Facial_emotion_images/train/surprise/17230.jpg
Duplicate: Facial_emotion_images/train/surprise/4150.jpg -> Original:Facial_emotion_images/train/surprise/16451.jpg
Duplicate: Facial_emotion_images/train/surprise/20064.jpg -> Original:Facial_emotion_images/train/surprise/24212.jpg
Duplicate: Facial_emotion_images/train/surprise/29180.jpg -> Original:Facial_emotion_images/train/surprise/15876.jpg
Duplicate: Facial_emotion_images/train/surprise/30108.jpg -> Original:Facial_emotion_images/train/surprise/8008.jpg
Duplicate: Facial_emotion_images/train/surprise/13534.jpg -> Original:Facial_emotion_images/train/surprise/26332.jpg
Duplicate: Facial_emotion_images/train/surprise/4728.jpg -> Original:Facial_emotion_images/train/surprise/9478.jpg
Duplicate: Facial_emotion_images/train/surprise/15532.jpg -> Original:Facial_emotion_images/train/surprise/15449.jpg
Duplicate: Facial_emotion_images/train/surprise/27970.jpg -> Original:Facial_emotion_images/train/surprise/4926.jpg
Duplicate: Facial_emotion_images/train/surprise/7949.jpg -> Original:Facial_emotion_images/train/surprise/1807.jpg
Duplicate: Facial_emotion_images/train/surprise/8464.jpg -> Original:Facial_emotion_images/train/surprise/26136.jpg
Duplicate: Facial_emotion_images/train/surprise/20449.jpg -> Original:Facial_emotion_images/train/surprise/18241.jpg
Duplicate: Facial_emotion_images/train/surprise/20624.jpg -> Original:Facial_emotion_images/train/surprise/9478.jpg
Duplicate: Facial_emotion_images/train/surprise/21934.jpg -> Original:Facial_emotion_images/train/surprise/16976.jpg
Duplicate: Facial_emotion_images/train/surprise/21890.jpg -> Original:Facial_emotion_images/train/surprise/708.jpg
Duplicate: Facial_emotion_images/train/surprise/2475.jpg -> Original:Facial_emotion_images/train/surprise/9672.jpg
Duplicate: Facial_emotion_images/train/surprise/4240.jpg -> Original:Facial_emotion_images/train/surprise/20241.jpg
Duplicate: Facial_emotion_images/train/surprise/30586.jpg -> Original:Facial_emotion_images/train/surprise/30393.jpg
Duplicate: Facial_emotion_images/train/surprise/3181.jpg -> Original:Facial_emotion_images/train/surprise/10855.jpg
Duplicate: Facial_emotion_images/train/surprise/31391.jpg -> Original:Facial_emotion_images/train/surprise/29357.jpg
Duplicate: Facial_emotion_images/train/surprise/20837.jpg -> Original:Facial_emotion_images/train/surprise/16259.jpg
Duplicate: Facial_emotion_images/train/surprise/8574.jpg -> Original:Facial_emotion_images/train/surprise/33755.jpg
Duplicate: Facial_emotion_images/train/surprise/27206.jpg -> Original:Facial_emotion_images/train/surprise/20211.jpg
Duplicate: Facial_emotion_images/train/surprise/19980.jpg -> Original:Facial_emotion_images/train/surprise/9031.jpg
Duplicate: Facial_emotion_images/train/surprise/3003.jpg -> Original:Facial_emotion_images/train/surprise/12780.jpg
Duplicate: Facial_emotion_images/train/surprise/9859.jpg -> Original:Facial_emotion_images/train/surprise/24107.jpg
Duplicate: Facial_emotion_images/train/surprise/35360.jpg -> Original:Facial_emotion_images/train/surprise/29909.jpg
Duplicate: Facial_emotion_images/train/surprise/17327.jpg -> Original:Facial_emotion_images/train/surprise/21366.jpg
Duplicate: Facial_emotion_images/train/surprise/3961.jpg -> Original:Facial_emotion_images/train/surprise/443.jpg
Duplicate: Facial_emotion_images/train/surprise/3232.jpg -> Original:Facial_emotion_images/train/surprise/1224.jpg
Duplicate: Facial_emotion_images/train/surprise/332.jpg -> Original:Facial_emotion_images/train/surprise/1289.jpg
Duplicate: Facial_emotion_images/train/surprise/17732.jpg -> Original:Facial_emotion_images/train/surprise/17540.jpg
Duplicate: Facial_emotion_images/train/surprise/30518.jpg -> Original:Facial_emotion_images/train/surprise/9996.jpg
Duplicate: Facial_emotion_images/train/surprise/22518.jpg -> Original:Facial_emotion_images/train/surprise/523.jpg
Duplicate: Facial_emotion_images/train/surprise/17427.jpg -> Original:Facial_emotion_images/train/surprise/12373.jpg
Duplicate: Facial_emotion_images/train/surprise/814.jpg -> Original:Facial_emotion_images/train/surprise/21179.jpg
Duplicate: Facial_emotion_images/train/surprise/21174.jpg -> Original:Facial_emotion_images/train/surprise/8463.jpg
Duplicate: Facial_emotion_images/train/surprise/4815.jpg -> Original:Facial_emotion_images/train/surprise/31463.jpg
Duplicate: Facial_emotion_images/train/surprise/10491.jpg -> Original:Facial_emotion_images/train/surprise/316.jpg
Duplicate: Facial_emotion_images/train/surprise/19786.jpg -> Original:Facial_emotion_images/train/surprise/9996.jpg
Duplicate: Facial_emotion_images/train/surprise/28881.jpg -> Original:Facial_emotion_images/train/surprise/30300.jpg
Duplicate: Facial_emotion_images/train/surprise/33158.jpg -> Original:Facial_emotion_images/train/surprise/31795.jpg
Duplicate: Facial_emotion_images/train/surprise/17385.jpg -> Original:Facial_emotion_images/train/surprise/4462.jpg
Duplicate: Facial_emotion_images/train/surprise/8297.jpg -> Original:Facial_emotion_images/train/surprise/23899.jpg
Duplicate: Facial_emotion_images/train/surprise/28785.jpg -> Original:Facial_emotion_images/train/surprise/10249.jpg
Duplicate: Facial_emotion_images/train/surprise/1185.jpg -> Original:Facial_emotion_images/train/surprise/3299.jpg
Duplicate: Facial_emotion_images/train/surprise/34738.jpg -> Original:Facial_emotion_images/train/surprise/18420.jpg
Duplicate: Facial_emotion_images/train/surprise/19708.jpg -> Original:Facial_emotion_images/train/surprise/6685.jpg
Duplicate: Facial_emotion_images/train/surprise/4577.jpg -> Original:Facial_emotion_images/train/surprise/28981.jpg
Duplicate: Facial_emotion_images/train/surprise/21446.jpg -> Original:Facial_emotion_images/train/surprise/1681.jpg
Duplicate: Facial_emotion_images/train/surprise/5597.jpg -> Original:Facial_emotion_images/train/surprise/13737.jpg
Duplicate: Facial_emotion_images/train/surprise/8975.jpg -> Original:Facial_emotion_images/train/surprise/6441.jpg
Duplicate: Facial_emotion_images/train/surprise/7860.jpg -> Original:Facial_emotion_images/train/surprise/29600.jpg
Duplicate: Facial_emotion_images/train/surprise/25468.jpg -> Original:Facial_emotion_images/train/surprise/21308.jpg
Duplicate: Facial_emotion_images/train/surprise/1369.jpg -> Original:Facial_emotion_images/train/surprise/2596.jpg
Duplicate: Facial_emotion_images/train/surprise/9127.jpg -> Original:Facial_emotion_images/train/surprise/25441.jpg
Duplicate: Facial_emotion_images/train/surprise/7097.jpg -> Original:Facial_emotion_images/train/surprise/13090.jpg
Duplicate: Facial_emotion_images/train/surprise/9626.jpg -> Original:Facial_emotion_images/train/surprise/16418.jpg
Duplicate: Facial_emotion_images/train/surprise/32824.jpg -> Original:Facial_emotion_images/train/surprise/20329.jpg
Duplicate: Facial_emotion_images/train/surprise/4252.jpg -> Original:Facial_emotion_images/train/surprise/29864.jpg
Duplicate: Facial_emotion_images/train/surprise/29274.jpg -> Original:Facial_emotion_images/train/surprise/32031.jpg
Duplicate: Facial_emotion_images/train/surprise/11631.jpg -> Original:Facial_emotion_images/train/surprise/27812.jpg
Duplicate: Facial_emotion_images/train/surprise/29169.jpg -> Original:Facial_emotion_images/train/surprise/9136.jpg
Duplicate: Facial_emotion_images/train/surprise/11576.jpg -> Original:Facial_emotion_images/train/surprise/34606.jpg
Duplicate: Facial_emotion_images/train/surprise/20767.jpg -> Original:Facial_emotion_images/train/surprise/11433.jpg
Duplicate: Facial_emotion_images/train/surprise/3933.jpg -> Original:Facial_emotion_images/train/surprise/1836.jpg
Duplicate: Facial_emotion_images/train/surprise/328.jpg -> Original:Facial_emotion_images/train/surprise/19498.jpg
Duplicate: Facial_emotion_images/train/surprise/31699.jpg -> Original:Facial_emotion_images/train/surprise/5563.jpg
Duplicate: Facial_emotion_images/train/surprise/27796.jpg -> Original:Facial_emotion_images/train/surprise/28838.jpg
Duplicate: Facial_emotion_images/train/surprise/31686.jpg -> Original:Facial_emotion_images/train/surprise/15119.jpg
Duplicate: Facial_emotion_images/train/surprise/33632.jpg -> Original:Facial_emotion_images/train/surprise/30300.jpg
Duplicate: Facial_emotion_images/train/surprise/12794.jpg -> Original:Facial_emotion_images/train/surprise/5905.jpg
Duplicate: Facial_emotion_images/train/surprise/14414.jpg -> Original:Facial_emotion_images/train/surprise/8328.jpg
Duplicate: Facial_emotion_images/train/surprise/35636.jpg -> Original:Facial_emotion_images/train/surprise/29293.jpg
Duplicate: Facial_emotion_images/train/surprise/8631.jpg -> Original:Facial_emotion_images/train/surprise/6508.jpg
Duplicate: Facial_emotion_images/train/surprise/5020.jpg -> Original:Facial_emotion_images/train/surprise/33908.jpg
Duplicate: Facial_emotion_images/train/surprise/18190.jpg -> Original:Facial_emotion_images/train/surprise/27989.jpg
Duplicate: Facial_emotion_images/train/surprise/22159.jpg -> Original:Facial_emotion_images/train/surprise/15449.jpg
Duplicate: Facial_emotion_images/train/surprise/30387.jpg -> Original:Facial_emotion_images/train/surprise/15065.jpg
Duplicate: Facial_emotion_images/train/surprise/7485.jpg -> Original:Facial_emotion_images/train/surprise/29600.jpg
Duplicate: Facial_emotion_images/train/surprise/24892.jpg -> Original:Facial_emotion_images/train/surprise/10357.jpg
Duplicate: Facial_emotion_images/train/surprise/7256.jpg -> Original:Facial_emotion_images/train/surprise/23254.jpg
Duplicate: Facial_emotion_images/train/surprise/17562.jpg -> Original:Facial_emotion_images/train/surprise/17780.jpg
Duplicate: Facial_emotion_images/train/surprise/33143.jpg -> Original:Facial_emotion_images/train/surprise/26820.jpg
Duplicate: Facial_emotion_images/train/surprise/27028.jpg -> Original:Facial_emotion_images/train/surprise/26156.jpg
Duplicate: Facial_emotion_images/train/surprise/27939.jpg -> Original:Facial_emotion_images/train/surprise/17348.jpg
Duplicate: Facial_emotion_images/train/surprise/21355.jpg -> Original:Facial_emotion_images/train/surprise/29050.jpg
Duplicate: Facial_emotion_images/train/surprise/16365.jpg -> Original:Facial_emotion_images/train/surprise/20537.jpg
Duplicate: Facial_emotion_images/train/surprise/10087.jpg -> Original:Facial_emotion_images/train/surprise/6451.jpg
Duplicate: Facial_emotion_images/train/surprise/9384.jpg -> Original:Facial_emotion_images/train/surprise/15745.jpg
Duplicate: Facial_emotion_images/train/surprise/25968.jpg -> Original:Facial_emotion_images/train/surprise/23349.jpg
Duplicate: Facial_emotion_images/train/surprise/22580.jpg -> Original:Facial_emotion_images/train/surprise/30008.jpg
Duplicate: Facial_emotion_images/train/surprise/34701.jpg -> Original:Facial_emotion_images/train/surprise/9031.jpg
Duplicate: Facial_emotion_images/train/surprise/26678.jpg -> Original:Facial_emotion_images/train/surprise/27884.jpg
Duplicate: Facial_emotion_images/train/surprise/9650.jpg -> Original:Facial_emotion_images/train/surprise/24553.jpg
Duplicate: Facial_emotion_images/train/surprise/26351.jpg -> Original:Facial_emotion_images/train/surprise/7483.jpg
Duplicate: Facial_emotion_images/train/surprise/8152.jpg -> Original:Facial_emotion_images/train/surprise/15317.jpg
Duplicate: Facial_emotion_images/train/surprise/24328.jpg -> Original:Facial_emotion_images/train/surprise/25198.jpg
Duplicate: Facial_emotion_images/train/surprise/14651.jpg -> Original:Facial_emotion_images/train/surprise/24406.jpg
Duplicate: Facial_emotion_images/train/surprise/29771.jpg -> Original:Facial_emotion_images/train/surprise/32949.jpg
Duplicate: Facial_emotion_images/train/surprise/18595.jpg -> Original:Facial_emotion_images/train/surprise/21342.jpg
Duplicate: Facial_emotion_images/train/surprise/18546.jpg -> Original:Facial_emotion_images/train/surprise/20329.jpg
Duplicate: Facial_emotion_images/train/surprise/2034.jpg -> Original:Facial_emotion_images/train/surprise/10446.jpg
Duplicate: Facial_emotion_images/train/surprise/21054.jpg -> Original:Facial_emotion_images/train/surprise/12454.jpg
Duplicate: Facial_emotion_images/train/surprise/10575.jpg -> Original:Facial_emotion_images/train/surprise/19777.jpg
Duplicate: Facial_emotion_images/train/surprise/15491.jpg -> Original:Facial_emotion_images/train/surprise/14289.jpg
Duplicate: Facial_emotion_images/train/surprise/17118.jpg -> Original:Facial_emotion_images/train/surprise/29613.jpg
Duplicate: Facial_emotion_images/train/surprise/35875.jpg -> Original:Facial_emotion_images/train/surprise/25490.jpg
Duplicate: Facial_emotion_images/train/surprise/23527.jpg -> Original:Facial_emotion_images/train/surprise/21558.jpg
Duplicate: Facial_emotion_images/train/surprise/24398.jpg -> Original:Facial_emotion_images/train/surprise/14552.jpg
Duplicate: Facial_emotion_images/train/surprise/29747.jpg -> Original:Facial_emotion_images/train/surprise/30623.jpg
Duplicate: Facial_emotion_images/train/surprise/18111.jpg -> Original:Facial_emotion_images/train/surprise/26640.jpg
Duplicate: Facial_emotion_images/train/surprise/8005.jpg -> Original:Facial_emotion_images/train/surprise/17348.jpg
Duplicate: Facial_emotion_images/train/surprise/11339.jpg -> Original:Facial_emotion_images/train/surprise/29952.jpg
Duplicate: Facial_emotion_images/train/surprise/24151.jpg -> Original:Facial_emotion_images/train/surprise/18273.jpg
Duplicate: Facial_emotion_images/train/surprise/19949.jpg -> Original:Facial_emotion_images/train/surprise/28755.jpg
Duplicate: Facial_emotion_images/train/surprise/23653.jpg -> Original:Facial_emotion_images/train/surprise/26640.jpg
Duplicate: Facial_emotion_images/train/surprise/29763.jpg -> Original:Facial_emotion_images/train/surprise/7716.jpg
Duplicate: Facial_emotion_images/train/surprise/22360.jpg -> Original:Facial_emotion_images/train/surprise/34048.jpg
Duplicate: Facial_emotion_images/train/surprise/32398.jpg -> Original:Facial_emotion_images/train/surprise/12046.jpg
Duplicate: Facial_emotion_images/train/surprise/27034.jpg -> Original:Facial_emotion_images/train/surprise/35087.jpg
Duplicate: Facial_emotion_images/train/surprise/20614.jpg -> Original:Facial_emotion_images/train/surprise/12865.jpg
Duplicate: Facial_emotion_images/train/surprise/8926.jpg -> Original:Facial_emotion_images/train/surprise/1084.jpg
Duplicate: Facial_emotion_images/train/surprise/9839.jpg -> Original:Facial_emotion_images/train/surprise/12176.jpg
Duplicate: Facial_emotion_images/train/surprise/26003.jpg -> Original:Facial_emotion_images/train/surprise/26186.jpg
Duplicate: Facial_emotion_images/train/surprise/34114.jpg -> Original:Facial_emotion_images/train/surprise/322.jpg
Duplicate: Facial_emotion_images/train/surprise/719.jpg -> Original:Facial_emotion_images/train/surprise/30071.jpg
Duplicate: Facial_emotion_images/train/surprise/35498.jpg -> Original:Facial_emotion_images/train/surprise/14052.jpg
Duplicate: Facial_emotion_images/train/surprise/26575.jpg -> Original:Facial_emotion_images/train/surprise/23743.jpg
Duplicate: Facial_emotion_images/train/surprise/35505.jpg -> Original:Facial_emotion_images/train/surprise/21998.jpg
Duplicate: Facial_emotion_images/train/surprise/24478.jpg -> Original:Facial_emotion_images/train/surprise/9924.jpg
Duplicate: Facial_emotion_images/train/surprise/1528.jpg -> Original:Facial_emotion_images/train/surprise/16451.jpg
Duplicate: Facial_emotion_images/train/surprise/25153.jpg -> Original:Facial_emotion_images/train/surprise/6714.jpg
Duplicate: Facial_emotion_images/train/surprise/7972.jpg -> Original:Facial_emotion_images/train/surprise/18530.jpg
Duplicate: Facial_emotion_images/train/surprise/27396.jpg -> Original:Facial_emotion_images/train/surprise/21867.jpg
Duplicate: Facial_emotion_images/train/surprise/25774.jpg -> Original:Facial_emotion_images/train/surprise/18712.jpg
Duplicate: Facial_emotion_images/train/surprise/15057.jpg -> Original:Facial_emotion_images/train/surprise/33501.jpg
Duplicate: Facial_emotion_images/train/surprise/14567.jpg -> Original:Facial_emotion_images/train/surprise/19212.jpg
Duplicate: Facial_emotion_images/train/surprise/11979.jpg -> Original:Facial_emotion_images/train/surprise/22243.jpg
Duplicate: Facial_emotion_images/train/surprise/35540.jpg -> Original:Facial_emotion_images/train/surprise/18515.jpg
Duplicate: Facial_emotion_images/train/surprise/15937.jpg -> Original:Facial_emotion_images/train/surprise/25916.jpg
Duplicate: Facial_emotion_images/train/surprise/34111.jpg -> Original:Facial_emotion_images/train/surprise/8618.jpg
Duplicate: Facial_emotion_images/train/surprise/17404.jpg -> Original:Facial_emotion_images/train/surprise/1836.jpg
Duplicate: Facial_emotion_images/train/surprise/10849.jpg -> Original:Facial_emotion_images/train/surprise/35388.jpg
Duplicate: Facial_emotion_images/train/surprise/31405.jpg -> Original:Facial_emotion_images/train/surprise/27852.jpg
Duplicate: Facial_emotion_images/train/surprise/5169.jpg -> Original:Facial_emotion_images/train/surprise/31787.jpg
Duplicate: Facial_emotion_images/train/surprise/7388.jpg -> Original:Facial_emotion_images/train/surprise/12974.jpg
Duplicate: Facial_emotion_images/train/surprise/21140.jpg -> Original:Facial_emotion_images/train/surprise/19453.jpg
Duplicate: Facial_emotion_images/train/surprise/1822.jpg -> Original:Facial_emotion_images/train/surprise/21106.jpg
Duplicate: Facial_emotion_images/train/surprise/22848.jpg -> Original:Facial_emotion_images/train/surprise/34734.jpg
Duplicate: Facial_emotion_images/train/surprise/34351.jpg -> Original:Facial_emotion_images/train/surprise/32265.jpg
Duplicate: Facial_emotion_images/train/surprise/13307.jpg -> Original:Facial_emotion_images/train/surprise/18004.jpg
Duplicate: Facial_emotion_images/train/surprise/28761.jpg -> Original:Facial_emotion_images/train/surprise/865.jpg
Duplicate: Facial_emotion_images/train/surprise/16325.jpg -> Original:Facial_emotion_images/train/surprise/27884.jpg
Duplicate: Facial_emotion_images/train/surprise/33306.jpg -> Original:Facial_emotion_images/train/surprise/16497.jpg
Duplicate: Facial_emotion_images/train/surprise/22975.jpg -> Original:Facial_emotion_images/train/surprise/10672.jpg
Duplicate: Facial_emotion_images/train/surprise/6118.jpg -> Original:Facial_emotion_images/train/surprise/13667.jpg
Duplicate: Facial_emotion_images/train/surprise/22872.jpg -> Original:Facial_emotion_images/train/surprise/13177.jpg
Duplicate: Facial_emotion_images/train/surprise/19556.jpg -> Original:Facial_emotion_images/train/surprise/13286.jpg
Duplicate: Facial_emotion_images/train/surprise/16707.jpg -> Original:Facial_emotion_images/train/surprise/11364.jpg
Duplicate: Facial_emotion_images/train/surprise/12610.jpg -> Original:Facial_emotion_images/train/surprise/13686.jpg
Duplicate: Facial_emotion_images/train/surprise/8325.jpg -> Original:Facial_emotion_images/train/surprise/32380.jpg
Duplicate: Facial_emotion_images/train/surprise/2358.jpg -> Original:Facial_emotion_images/train/surprise/7042.jpg
Duplicate: Facial_emotion_images/train/surprise/20996.jpg -> Original:Facial_emotion_images/train/surprise/11824.jpg
Duplicate: Facial_emotion_images/train/surprise/7736.jpg -> Original:Facial_emotion_images/train/surprise/6508.jpg
Duplicate: Facial_emotion_images/train/surprise/33232.jpg -> Original:Facial_emotion_images/train/surprise/28227.jpg
Duplicate: Facial_emotion_images/train/surprise/13400.jpg -> Original:Facial_emotion_images/train/surprise/6595.jpg
Duplicate: Facial_emotion_images/train/surprise/34956.jpg -> Original:Facial_emotion_images/train/surprise/17310.jpg
Duplicate: Facial_emotion_images/train/surprise/28544.jpg -> Original:Facial_emotion_images/train/surprise/32989.jpg
Duplicate: Facial_emotion_images/train/surprise/24832.jpg -> Original:Facial_emotion_images/train/surprise/26565.jpg
Duplicate: Facial_emotion_images/train/surprise/22825.jpg -> Original:Facial_emotion_images/train/surprise/29104.jpg
Duplicate: Facial_emotion_images/train/surprise/35219.jpg -> Original:Facial_emotion_images/train/surprise/8368.jpg
Duplicate: Facial_emotion_images/train/surprise/32040.jpg -> Original:Facial_emotion_images/train/surprise/848.jpg
Duplicate: Facial_emotion_images/train/surprise/35662.jpg -> Original:Facial_emotion_images/train/surprise/3135.jpg
Duplicate: Facial_emotion_images/train/surprise/2804.jpg -> Original:Facial_emotion_images/train/surprise/21516.jpg
Duplicate: Facial_emotion_images/train/surprise/28861.jpg -> Original:Facial_emotion_images/train/surprise/6513.jpg
Duplicate: Facial_emotion_images/train/surprise/17431.jpg -> Original:Facial_emotion_images/train/surprise/4344.jpg
Duplicate: Facial_emotion_images/train/surprise/25313.jpg -> Original:Facial_emotion_images/train/surprise/24835.jpg
Duplicate: Facial_emotion_images/train/surprise/33734.jpg -> Original:Facial_emotion_images/train/surprise/24553.jpg
Duplicate: Facial_emotion_images/train/surprise/5703.jpg -> Original:Facial_emotion_images/train/surprise/24795.jpg
Duplicate: Facial_emotion_images/train/surprise/21392.jpg -> Original:Facial_emotion_images/train/surprise/22310.jpg
Duplicate: Facial_emotion_images/train/surprise/24985.jpg -> Original:Facial_emotion_images/train/surprise/29345.jpg
Duplicate: Facial_emotion_images/train/surprise/34817.jpg -> Original:Facial_emotion_images/train/surprise/19774.jpg
Duplicate: Facial_emotion_images/train/surprise/18639.jpg -> Original:Facial_emotion_images/train/surprise/21558.jpg
Duplicate: Facial_emotion_images/train/surprise/21633.jpg -> Original:Facial_emotion_images/train/surprise/30005.jpg
Duplicate: Facial_emotion_images/train/surprise/4158.jpg -> Original:Facial_emotion_images/train/surprise/31047.jpg
Duplicate: Facial_emotion_images/train/surprise/7347.jpg -> Original:Facial_emotion_images/train/surprise/27123.jpg
Duplicate: Facial_emotion_images/train/surprise/13914.jpg -> Original:Facial_emotion_images/train/surprise/31294.jpg
Duplicate: Facial_emotion_images/train/surprise/17322.jpg -> Original:Facial_emotion_images/train/surprise/6384.jpg
Duplicate: Facial_emotion_images/train/surprise/21444.jpg -> Original:Facial_emotion_images/train/surprise/27664.jpg
Duplicate: Facial_emotion_images/train/surprise/17944.jpg -> Original:Facial_emotion_images/train/surprise/35002.jpg
Duplicate: Facial_emotion_images/train/surprise/9164.jpg -> Original:Facial_emotion_images/train/surprise/34957.jpg
Duplicate: Facial_emotion_images/train/surprise/2032.jpg -> Original:Facial_emotion_images/train/surprise/5870.jpg
Duplicate: Facial_emotion_images/train/surprise/6439.jpg -> Original:Facial_emotion_images/train/surprise/25724.jpg
Duplicate: Facial_emotion_images/train/surprise/32925.jpg -> Original:Facial_emotion_images/train/surprise/20692.jpg
Duplicate: Facial_emotion_images/train/surprise/24759.jpg -> Original:Facial_emotion_images/train/surprise/35227.jpg
Duplicate: Facial_emotion_images/train/surprise/18093.jpg -> Original:Facial_emotion_images/train/surprise/29886.jpg
Duplicate: Facial_emotion_images/train/surprise/25699.jpg -> Original:Facial_emotion_images/train/surprise/25954.jpg
Duplicate: Facial_emotion_images/train/surprise/4416.jpg -> Original:Facial_emotion_images/train/surprise/34369.jpg
Duplicate: Facial_emotion_images/train/surprise/17900.jpg -> Original:Facial_emotion_images/train/surprise/12997.jpg
Duplicate: Facial_emotion_images/train/surprise/21507.jpg -> Original:Facial_emotion_images/train/surprise/1836.jpg
Duplicate: Facial_emotion_images/train/surprise/20077.jpg -> Original:Facial_emotion_images/train/surprise/30949.jpg
Duplicate: Facial_emotion_images/train/surprise/12052.jpg -> Original:Facial_emotion_images/train/surprise/494.jpg
Duplicate: Facial_emotion_images/train/surprise/13507.jpg -> Original:Facial_emotion_images/train/surprise/34933.jpg
Duplicate: Facial_emotion_images/train/surprise/34169.jpg -> Original:Facial_emotion_images/train/surprise/6601.jpg
Duplicate: Facial_emotion_images/train/surprise/24124.jpg -> Original:Facial_emotion_images/train/surprise/35531.jpg
Duplicate: Facial_emotion_images/train/surprise/27877.jpg -> Original:Facial_emotion_images/train/surprise/20382.jpg
Duplicate: Facial_emotion_images/train/surprise/4313.jpg -> Original:Facial_emotion_images/train/surprise/6250.jpg
Duplicate: Facial_emotion_images/train/surprise/13311.jpg -> Original:Facial_emotion_images/train/surprise/19920.jpg
Duplicate: Facial_emotion_images/train/surprise/21969.jpg -> Original:Facial_emotion_images/train/surprise/25026.jpg
Duplicate: Facial_emotion_images/train/surprise/33652.jpg -> Original:Facial_emotion_images/train/surprise/27811.jpg
Duplicate: Facial_emotion_images/train/surprise/8189.jpg -> Original:Facial_emotion_images/train/surprise/3239.jpg
Duplicate: Facial_emotion_images/train/surprise/329.jpg -> Original:Facial_emotion_images/train/surprise/32170.jpg
Duplicate: Facial_emotion_images/train/surprise/751.jpg -> Original:Facial_emotion_images/train/surprise/18814.jpg
Duplicate: Facial_emotion_images/train/surprise/1665.jpg -> Original:Facial_emotion_images/train/surprise/12102.jpg
Duplicate: Facial_emotion_images/train/surprise/9038.jpg -> Original:Facial_emotion_images/train/surprise/21443.jpg
Duplicate: Facial_emotion_images/train/surprise/34472.jpg -> Original:Facial_emotion_images/train/surprise/26309.jpg
Duplicate: Facial_emotion_images/train/surprise/4509.jpg -> Original:Facial_emotion_images/train/surprise/16418.jpg
Duplicate: Facial_emotion_images/train/surprise/10556.jpg -> Original:Facial_emotion_images/train/surprise/33429.jpg
Duplicate: Facial_emotion_images/train/surprise/34923.jpg -> Original:Facial_emotion_images/train/surprise/497.jpg
Duplicate: Facial_emotion_images/train/surprise/32212.jpg -> Original:Facial_emotion_images/train/surprise/24958.jpg
Duplicate: Facial_emotion_images/train/surprise/31448.jpg -> Original:Facial_emotion_images/train/surprise/2140.jpg
Duplicate: Facial_emotion_images/train/surprise/8426.jpg -> Original:Facial_emotion_images/train/surprise/11730.jpg
Duplicate: Facial_emotion_images/train/surprise/16627.jpg -> Original:Facial_emotion_images/train/surprise/4344.jpg
Duplicate: Facial_emotion_images/train/surprise/18178.jpg -> Original:Facial_emotion_images/train/surprise/33911.jpg
Duplicate: Facial_emotion_images/train/surprise/28891.jpg -> Original:Facial_emotion_images/train/surprise/9969.jpg
Duplicate: Facial_emotion_images/train/surprise/23228.jpg -> Original:Facial_emotion_images/train/surprise/10007.jpg
Duplicate: Facial_emotion_images/train/surprise/28542.jpg -> Original:Facial_emotion_images/train/surprise/7040.jpg
Duplicate: Facial_emotion_images/train/surprise/28268.jpg -> Original:Facial_emotion_images/train/surprise/20929.jpg
Duplicate: Facial_emotion_images/train/surprise/8794.jpg -> Original:Facial_emotion_images/train/surprise/17342.jpg
Duplicate: Facial_emotion_images/train/surprise/11459.jpg -> Original:Facial_emotion_images/train/surprise/24446.jpg
Duplicate: Facial_emotion_images/train/surprise/13331.jpg -> Original:Facial_emotion_images/train/surprise/8232.jpg
Duplicate: Facial_emotion_images/train/surprise/16620.jpg -> Original:Facial_emotion_images/train/surprise/9949.jpg
Duplicate: Facial_emotion_images/train/surprise/30751.jpg -> Original:Facial_emotion_images/train/surprise/22070.jpg
Duplicate: Facial_emotion_images/train/surprise/7193.jpg -> Original:Facial_emotion_images/train/surprise/27763.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/train/surprise/22477.jpg -> Original:Facial_emotion_images/train/surprise/35285.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/surprise/32716.jpg -> Original:Facial_emotion_images/train/surprise/31671.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/surprise/595.jpg -> Original:Facial_emotion_images/train/surprise/32749.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/surprise/27071.jpg -> Original:Facial_emotion_images/train/surprise/8979.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/train/surprise/17004.jpg -> Original:Facial_emotion_images/train/surprise/7699.jpg
No description has been provided for this image

Observations¶

  1. There are 32 duplicate photos in the training happy face folder
  2. There are 65 duplicate photos in the training sad face folder
  3. There are 69 duplicate photos in the training neutral face folder
  4. There are 498 duplicate photos in the training neutral face folder

*Duplicates will be removed from all subfolders to prevent overfitting to duplicated images

In [17]:
#Function to determine and remove duplicates:
def removeDuplicates(folderPath):
  hashes={}
  duplicates = []
  duplicate_count = 0

  for file_name in os.listdir(folderPath):
    file_path = os.path.join(folderPath, file_name)
    if os.path.isfile(file_path):
      file_hash = calculateHash(file_path)
      if file_hash in hashes:
        duplicates.append(file_path)
        os.remove(file_path)
        duplicate_count+=1
      else:
        hashes[file_hash] = file_path

  print(f"Total duplicates removed: {duplicate_count}")

  if duplicate_count > 0:
    print("Removed files:")
    for dup in duplicates:
      print(f"{dup}")
In [18]:
#Remove duplicates from the training happy face folder
removeDuplicates('Facial_emotion_images/train/happy/')
Total duplicates removed: 32
Removed files:
Facial_emotion_images/train/happy/19817.jpg
Facial_emotion_images/train/happy/21407.jpg
Facial_emotion_images/train/happy/18902.jpg
Facial_emotion_images/train/happy/20944.jpg
Facial_emotion_images/train/happy/20258.jpg
Facial_emotion_images/train/happy/21607.jpg
Facial_emotion_images/train/happy/31292.jpg
Facial_emotion_images/train/happy/34825.jpg
Facial_emotion_images/train/happy/30217.jpg
Facial_emotion_images/train/happy/17753.jpg
Facial_emotion_images/train/happy/34976.jpg
Facial_emotion_images/train/happy/17595.jpg
Facial_emotion_images/train/happy/29095.jpg
Facial_emotion_images/train/happy/28470.jpg
Facial_emotion_images/train/happy/32166.jpg
Facial_emotion_images/train/happy/17436.jpg
Facial_emotion_images/train/happy/27142.jpg
Facial_emotion_images/train/happy/17814.jpg
Facial_emotion_images/train/happy/17407.jpg
Facial_emotion_images/train/happy/24752.jpg
Facial_emotion_images/train/happy/21839.jpg
Facial_emotion_images/train/happy/27042.jpg
Facial_emotion_images/train/happy/27638.jpg
Facial_emotion_images/train/happy/28728.jpg
Facial_emotion_images/train/happy/28698.jpg
Facial_emotion_images/train/happy/30891.jpg
Facial_emotion_images/train/happy/32416.jpg
Facial_emotion_images/train/happy/26080.jpg
Facial_emotion_images/train/happy/33854.jpg
Facial_emotion_images/train/happy/34961.jpg
Facial_emotion_images/train/happy/34368.jpg
Facial_emotion_images/train/happy/20370.jpg
In [19]:
#Remove duplicates from the training sad face folder
removeDuplicates('Facial_emotion_images/train/sad/')
Total duplicates removed: 65
Removed files:
Facial_emotion_images/train/sad/24744.jpg
Facial_emotion_images/train/sad/16246.jpg
Facial_emotion_images/train/sad/28750.jpg
Facial_emotion_images/train/sad/10983.jpg
Facial_emotion_images/train/sad/26546.jpg
Facial_emotion_images/train/sad/14527.jpg
Facial_emotion_images/train/sad/14644.jpg
Facial_emotion_images/train/sad/25252.jpg
Facial_emotion_images/train/sad/26903.jpg
Facial_emotion_images/train/sad/7151.jpg
Facial_emotion_images/train/sad/30711.jpg
Facial_emotion_images/train/sad/25965.jpg
Facial_emotion_images/train/sad/17210.jpg
Facial_emotion_images/train/sad/12550.jpg
Facial_emotion_images/train/sad/21519.jpg
Facial_emotion_images/train/sad/26975.jpg
Facial_emotion_images/train/sad/8997.jpg
Facial_emotion_images/train/sad/30752.jpg
Facial_emotion_images/train/sad/25951.jpg
Facial_emotion_images/train/sad/31302.jpg
Facial_emotion_images/train/sad/30750.jpg
Facial_emotion_images/train/sad/34373.jpg
Facial_emotion_images/train/sad/7741.jpg
Facial_emotion_images/train/sad/29565.jpg
Facial_emotion_images/train/sad/25588.jpg
Facial_emotion_images/train/sad/34672.jpg
Facial_emotion_images/train/sad/33707.jpg
Facial_emotion_images/train/sad/24287.jpg
Facial_emotion_images/train/sad/15676.jpg
Facial_emotion_images/train/sad/26829.jpg
Facial_emotion_images/train/sad/22276.jpg
Facial_emotion_images/train/sad/25463.jpg
Facial_emotion_images/train/sad/20402.jpg
Facial_emotion_images/train/sad/25504.jpg
Facial_emotion_images/train/sad/13484.jpg
Facial_emotion_images/train/sad/19909.jpg
Facial_emotion_images/train/sad/19580.jpg
Facial_emotion_images/train/sad/35539.jpg
Facial_emotion_images/train/sad/31174.jpg
Facial_emotion_images/train/sad/24986.jpg
Facial_emotion_images/train/sad/21786.jpg
Facial_emotion_images/train/sad/23290.jpg
Facial_emotion_images/train/sad/10844.jpg
Facial_emotion_images/train/sad/24140.jpg
Facial_emotion_images/train/sad/31220.jpg
Facial_emotion_images/train/sad/19249.jpg
Facial_emotion_images/train/sad/14769.jpg
Facial_emotion_images/train/sad/22730.jpg
Facial_emotion_images/train/sad/8865.jpg
Facial_emotion_images/train/sad/15371.jpg
Facial_emotion_images/train/sad/10753.jpg
Facial_emotion_images/train/sad/18330.jpg
Facial_emotion_images/train/sad/12946.jpg
Facial_emotion_images/train/sad/29765.jpg
Facial_emotion_images/train/sad/31459.jpg
Facial_emotion_images/train/sad/29350.jpg
Facial_emotion_images/train/sad/20362.jpg
Facial_emotion_images/train/sad/24698.jpg
Facial_emotion_images/train/sad/29188.jpg
Facial_emotion_images/train/sad/32091.jpg
Facial_emotion_images/train/sad/25860.jpg
Facial_emotion_images/train/sad/33778.jpg
Facial_emotion_images/train/sad/17398.jpg
Facial_emotion_images/train/sad/7602.jpg
Facial_emotion_images/train/sad/29594.jpg
In [20]:
#Remove duplicates from the training neutral face folder
removeDuplicates('Facial_emotion_images/train/neutral/')
Total duplicates removed: 69
Removed files:
Facial_emotion_images/train/neutral/33041.jpg
Facial_emotion_images/train/neutral/19628.jpg
Facial_emotion_images/train/neutral/21448.jpg
Facial_emotion_images/train/neutral/13994.jpg
Facial_emotion_images/train/neutral/24722.jpg
Facial_emotion_images/train/neutral/13017.jpg
Facial_emotion_images/train/neutral/29666.jpg
Facial_emotion_images/train/neutral/13931.jpg
Facial_emotion_images/train/neutral/8181.jpg
Facial_emotion_images/train/neutral/31073.jpg
Facial_emotion_images/train/neutral/31059.jpg
Facial_emotion_images/train/neutral/11531.jpg
Facial_emotion_images/train/neutral/13140.jpg
Facial_emotion_images/train/neutral/27219.jpg
Facial_emotion_images/train/neutral/18697.jpg
Facial_emotion_images/train/neutral/34183.jpg
Facial_emotion_images/train/neutral/20874.jpg
Facial_emotion_images/train/neutral/35442.jpg
Facial_emotion_images/train/neutral/12325.jpg
Facial_emotion_images/train/neutral/30561.jpg
Facial_emotion_images/train/neutral/20797.jpg
Facial_emotion_images/train/neutral/32313.jpg
Facial_emotion_images/train/neutral/33404.jpg
Facial_emotion_images/train/neutral/21871.jpg
Facial_emotion_images/train/neutral/33428.jpg
Facial_emotion_images/train/neutral/33901.jpg
Facial_emotion_images/train/neutral/9262.jpg
Facial_emotion_images/train/neutral/22229.jpg
Facial_emotion_images/train/neutral/10612.jpg
Facial_emotion_images/train/neutral/14019.jpg
Facial_emotion_images/train/neutral/33503.jpg
Facial_emotion_images/train/neutral/10523.jpg
Facial_emotion_images/train/neutral/12165.jpg
Facial_emotion_images/train/neutral/16118.jpg
Facial_emotion_images/train/neutral/17073.jpg
Facial_emotion_images/train/neutral/25758.jpg
Facial_emotion_images/train/neutral/31318.jpg
Facial_emotion_images/train/neutral/27159.jpg
Facial_emotion_images/train/neutral/17409.jpg
Facial_emotion_images/train/neutral/12740.jpg
Facial_emotion_images/train/neutral/14573.jpg
Facial_emotion_images/train/neutral/23928.jpg
Facial_emotion_images/train/neutral/22352.jpg
Facial_emotion_images/train/neutral/30457.jpg
Facial_emotion_images/train/neutral/16427.jpg
Facial_emotion_images/train/neutral/33724.jpg
Facial_emotion_images/train/neutral/11148.jpg
Facial_emotion_images/train/neutral/19886.jpg
Facial_emotion_images/train/neutral/30515.jpg
Facial_emotion_images/train/neutral/19994.jpg
Facial_emotion_images/train/neutral/32435.jpg
Facial_emotion_images/train/neutral/34603.jpg
Facial_emotion_images/train/neutral/34123.jpg
Facial_emotion_images/train/neutral/32213.jpg
Facial_emotion_images/train/neutral/31832.jpg
Facial_emotion_images/train/neutral/32449.jpg
Facial_emotion_images/train/neutral/9998.jpg
Facial_emotion_images/train/neutral/30287.jpg
Facial_emotion_images/train/neutral/21986.jpg
Facial_emotion_images/train/neutral/12670.jpg
Facial_emotion_images/train/neutral/21479.jpg
Facial_emotion_images/train/neutral/22507.jpg
Facial_emotion_images/train/neutral/20045.jpg
Facial_emotion_images/train/neutral/9195.jpg
Facial_emotion_images/train/neutral/25952.jpg
Facial_emotion_images/train/neutral/11086.jpg
Facial_emotion_images/train/neutral/26154.jpg
Facial_emotion_images/train/neutral/19635.jpg
Facial_emotion_images/train/neutral/10936.jpg
In [21]:
#Remove duplicates from the training surprise face folder
removeDuplicates('Facial_emotion_images/train/surprise/')
Total duplicates removed: 498
Removed files:
Facial_emotion_images/train/surprise/22477.jpg
Facial_emotion_images/train/surprise/32716.jpg
Facial_emotion_images/train/surprise/595.jpg
Facial_emotion_images/train/surprise/27071.jpg
Facial_emotion_images/train/surprise/17004.jpg
Facial_emotion_images/train/surprise/11089.jpg
Facial_emotion_images/train/surprise/3781.jpg
Facial_emotion_images/train/surprise/4436.jpg
Facial_emotion_images/train/surprise/7060.jpg
Facial_emotion_images/train/surprise/15770.jpg
Facial_emotion_images/train/surprise/27531.jpg
Facial_emotion_images/train/surprise/34816.jpg
Facial_emotion_images/train/surprise/28662.jpg
Facial_emotion_images/train/surprise/10184.jpg
Facial_emotion_images/train/surprise/9985.jpg
Facial_emotion_images/train/surprise/8079.jpg
Facial_emotion_images/train/surprise/9990.jpg
Facial_emotion_images/train/surprise/28172.jpg
Facial_emotion_images/train/surprise/35164.jpg
Facial_emotion_images/train/surprise/28051.jpg
Facial_emotion_images/train/surprise/2344.jpg
Facial_emotion_images/train/surprise/12745.jpg
Facial_emotion_images/train/surprise/31633.jpg
Facial_emotion_images/train/surprise/6486.jpg
Facial_emotion_images/train/surprise/6936.jpg
Facial_emotion_images/train/surprise/23128.jpg
Facial_emotion_images/train/surprise/6712.jpg
Facial_emotion_images/train/surprise/13565.jpg
Facial_emotion_images/train/surprise/21895.jpg
Facial_emotion_images/train/surprise/10873.jpg
Facial_emotion_images/train/surprise/13033.jpg
Facial_emotion_images/train/surprise/22007.jpg
Facial_emotion_images/train/surprise/5616.jpg
Facial_emotion_images/train/surprise/18764.jpg
Facial_emotion_images/train/surprise/4407.jpg
Facial_emotion_images/train/surprise/21382.jpg
Facial_emotion_images/train/surprise/1157.jpg
Facial_emotion_images/train/surprise/22437.jpg
Facial_emotion_images/train/surprise/8560.jpg
Facial_emotion_images/train/surprise/31348.jpg
Facial_emotion_images/train/surprise/11519.jpg
Facial_emotion_images/train/surprise/18207.jpg
Facial_emotion_images/train/surprise/30873.jpg
Facial_emotion_images/train/surprise/20985.jpg
Facial_emotion_images/train/surprise/26589.jpg
Facial_emotion_images/train/surprise/33886.jpg
Facial_emotion_images/train/surprise/12201.jpg
Facial_emotion_images/train/surprise/8208.jpg
Facial_emotion_images/train/surprise/6847.jpg
Facial_emotion_images/train/surprise/27659.jpg
Facial_emotion_images/train/surprise/7454.jpg
Facial_emotion_images/train/surprise/26999.jpg
Facial_emotion_images/train/surprise/27264.jpg
Facial_emotion_images/train/surprise/19691.jpg
Facial_emotion_images/train/surprise/24127.jpg
Facial_emotion_images/train/surprise/24584.jpg
Facial_emotion_images/train/surprise/18370.jpg
Facial_emotion_images/train/surprise/17121.jpg
Facial_emotion_images/train/surprise/6240.jpg
Facial_emotion_images/train/surprise/25222.jpg
Facial_emotion_images/train/surprise/9942.jpg
Facial_emotion_images/train/surprise/19283.jpg
Facial_emotion_images/train/surprise/5365.jpg
Facial_emotion_images/train/surprise/28167.jpg
Facial_emotion_images/train/surprise/20015.jpg
Facial_emotion_images/train/surprise/362.jpg
Facial_emotion_images/train/surprise/8683.jpg
Facial_emotion_images/train/surprise/28905.jpg
Facial_emotion_images/train/surprise/13257.jpg
Facial_emotion_images/train/surprise/21071.jpg
Facial_emotion_images/train/surprise/19830.jpg
Facial_emotion_images/train/surprise/5492.jpg
Facial_emotion_images/train/surprise/33251.jpg
Facial_emotion_images/train/surprise/6588.jpg
Facial_emotion_images/train/surprise/4946.jpg
Facial_emotion_images/train/surprise/33430.jpg
Facial_emotion_images/train/surprise/34016.jpg
Facial_emotion_images/train/surprise/21123.jpg
Facial_emotion_images/train/surprise/4375.jpg
Facial_emotion_images/train/surprise/11047.jpg
Facial_emotion_images/train/surprise/30630.jpg
Facial_emotion_images/train/surprise/19781.jpg
Facial_emotion_images/train/surprise/2188.jpg
Facial_emotion_images/train/surprise/32611.jpg
Facial_emotion_images/train/surprise/2883.jpg
Facial_emotion_images/train/surprise/11119.jpg
Facial_emotion_images/train/surprise/35174.jpg
Facial_emotion_images/train/surprise/14926.jpg
Facial_emotion_images/train/surprise/8895.jpg
Facial_emotion_images/train/surprise/17825.jpg
Facial_emotion_images/train/surprise/18730.jpg
Facial_emotion_images/train/surprise/1430.jpg
Facial_emotion_images/train/surprise/4251.jpg
Facial_emotion_images/train/surprise/8715.jpg
Facial_emotion_images/train/surprise/26029.jpg
Facial_emotion_images/train/surprise/32985.jpg
Facial_emotion_images/train/surprise/12195.jpg
Facial_emotion_images/train/surprise/23378.jpg
Facial_emotion_images/train/surprise/33500.jpg
Facial_emotion_images/train/surprise/34647.jpg
Facial_emotion_images/train/surprise/3928.jpg
Facial_emotion_images/train/surprise/18229.jpg
Facial_emotion_images/train/surprise/31199.jpg
Facial_emotion_images/train/surprise/11279.jpg
Facial_emotion_images/train/surprise/26735.jpg
Facial_emotion_images/train/surprise/15199.jpg
Facial_emotion_images/train/surprise/2908.jpg
Facial_emotion_images/train/surprise/25852.jpg
Facial_emotion_images/train/surprise/7476.jpg
Facial_emotion_images/train/surprise/18125.jpg
Facial_emotion_images/train/surprise/22982.jpg
Facial_emotion_images/train/surprise/30929.jpg
Facial_emotion_images/train/surprise/30037.jpg
Facial_emotion_images/train/surprise/21781.jpg
Facial_emotion_images/train/surprise/25178.jpg
Facial_emotion_images/train/surprise/29533.jpg
Facial_emotion_images/train/surprise/5696.jpg
Facial_emotion_images/train/surprise/6357.jpg
Facial_emotion_images/train/surprise/18620.jpg
Facial_emotion_images/train/surprise/5294.jpg
Facial_emotion_images/train/surprise/15747.jpg
Facial_emotion_images/train/surprise/19915.jpg
Facial_emotion_images/train/surprise/12918.jpg
Facial_emotion_images/train/surprise/8324.jpg
Facial_emotion_images/train/surprise/32780.jpg
Facial_emotion_images/train/surprise/14001.jpg
Facial_emotion_images/train/surprise/31978.jpg
Facial_emotion_images/train/surprise/22369.jpg
Facial_emotion_images/train/surprise/2259.jpg
Facial_emotion_images/train/surprise/26362.jpg
Facial_emotion_images/train/surprise/12385.jpg
Facial_emotion_images/train/surprise/32004.jpg
Facial_emotion_images/train/surprise/8055.jpg
Facial_emotion_images/train/surprise/6594.jpg
Facial_emotion_images/train/surprise/19482.jpg
Facial_emotion_images/train/surprise/24502.jpg
Facial_emotion_images/train/surprise/33596.jpg
Facial_emotion_images/train/surprise/4630.jpg
Facial_emotion_images/train/surprise/27211.jpg
Facial_emotion_images/train/surprise/32774.jpg
Facial_emotion_images/train/surprise/6411.jpg
Facial_emotion_images/train/surprise/30142.jpg
Facial_emotion_images/train/surprise/1145.jpg
Facial_emotion_images/train/surprise/35750.jpg
Facial_emotion_images/train/surprise/8132.jpg
Facial_emotion_images/train/surprise/30876.jpg
Facial_emotion_images/train/surprise/17478.jpg
Facial_emotion_images/train/surprise/26824.jpg
Facial_emotion_images/train/surprise/23376.jpg
Facial_emotion_images/train/surprise/23268.jpg
Facial_emotion_images/train/surprise/21522.jpg
Facial_emotion_images/train/surprise/20139.jpg
Facial_emotion_images/train/surprise/8698.jpg
Facial_emotion_images/train/surprise/18845.jpg
Facial_emotion_images/train/surprise/10061.jpg
Facial_emotion_images/train/surprise/26427.jpg
Facial_emotion_images/train/surprise/26444.jpg
Facial_emotion_images/train/surprise/11027.jpg
Facial_emotion_images/train/surprise/30725.jpg
Facial_emotion_images/train/surprise/9036.jpg
Facial_emotion_images/train/surprise/20764.jpg
Facial_emotion_images/train/surprise/28283.jpg
Facial_emotion_images/train/surprise/34743.jpg
Facial_emotion_images/train/surprise/5456.jpg
Facial_emotion_images/train/surprise/8869.jpg
Facial_emotion_images/train/surprise/357.jpg
Facial_emotion_images/train/surprise/33746.jpg
Facial_emotion_images/train/surprise/32988.jpg
Facial_emotion_images/train/surprise/24599.jpg
Facial_emotion_images/train/surprise/4330.jpg
Facial_emotion_images/train/surprise/964.jpg
Facial_emotion_images/train/surprise/14177.jpg
Facial_emotion_images/train/surprise/21924.jpg
Facial_emotion_images/train/surprise/9801.jpg
Facial_emotion_images/train/surprise/22393.jpg
Facial_emotion_images/train/surprise/35130.jpg
Facial_emotion_images/train/surprise/11111.jpg
Facial_emotion_images/train/surprise/23692.jpg
Facial_emotion_images/train/surprise/23796.jpg
Facial_emotion_images/train/surprise/20774.jpg
Facial_emotion_images/train/surprise/33484.jpg
Facial_emotion_images/train/surprise/22263.jpg
Facial_emotion_images/train/surprise/2351.jpg
Facial_emotion_images/train/surprise/21129.jpg
Facial_emotion_images/train/surprise/4461.jpg
Facial_emotion_images/train/surprise/6676.jpg
Facial_emotion_images/train/surprise/27490.jpg
Facial_emotion_images/train/surprise/10410.jpg
Facial_emotion_images/train/surprise/22812.jpg
Facial_emotion_images/train/surprise/26874.jpg
Facial_emotion_images/train/surprise/21727.jpg
Facial_emotion_images/train/surprise/11633.jpg
Facial_emotion_images/train/surprise/25353.jpg
Facial_emotion_images/train/surprise/1824.jpg
Facial_emotion_images/train/surprise/4426.jpg
Facial_emotion_images/train/surprise/31512.jpg
Facial_emotion_images/train/surprise/25466.jpg
Facial_emotion_images/train/surprise/16162.jpg
Facial_emotion_images/train/surprise/23843.jpg
Facial_emotion_images/train/surprise/18437.jpg
Facial_emotion_images/train/surprise/2968.jpg
Facial_emotion_images/train/surprise/20924.jpg
Facial_emotion_images/train/surprise/24215.jpg
Facial_emotion_images/train/surprise/26349.jpg
Facial_emotion_images/train/surprise/15813.jpg
Facial_emotion_images/train/surprise/4012.jpg
Facial_emotion_images/train/surprise/1201.jpg
Facial_emotion_images/train/surprise/13131.jpg
Facial_emotion_images/train/surprise/29368.jpg
Facial_emotion_images/train/surprise/9789.jpg
Facial_emotion_images/train/surprise/15545.jpg
Facial_emotion_images/train/surprise/24816.jpg
Facial_emotion_images/train/surprise/7610.jpg
Facial_emotion_images/train/surprise/6773.jpg
Facial_emotion_images/train/surprise/15259.jpg
Facial_emotion_images/train/surprise/1232.jpg
Facial_emotion_images/train/surprise/32484.jpg
Facial_emotion_images/train/surprise/25776.jpg
Facial_emotion_images/train/surprise/7431.jpg
Facial_emotion_images/train/surprise/7315.jpg
Facial_emotion_images/train/surprise/11393.jpg
Facial_emotion_images/train/surprise/24793.jpg
Facial_emotion_images/train/surprise/19660.jpg
Facial_emotion_images/train/surprise/33385.jpg
Facial_emotion_images/train/surprise/29833.jpg
Facial_emotion_images/train/surprise/28065.jpg
Facial_emotion_images/train/surprise/16326.jpg
Facial_emotion_images/train/surprise/17317.jpg
Facial_emotion_images/train/surprise/21768.jpg
Facial_emotion_images/train/surprise/3060.jpg
Facial_emotion_images/train/surprise/21821.jpg
Facial_emotion_images/train/surprise/3569.jpg
Facial_emotion_images/train/surprise/29271.jpg
Facial_emotion_images/train/surprise/15461.jpg
Facial_emotion_images/train/surprise/31998.jpg
Facial_emotion_images/train/surprise/15607.jpg
Facial_emotion_images/train/surprise/25488.jpg
Facial_emotion_images/train/surprise/10963.jpg
Facial_emotion_images/train/surprise/28671.jpg
Facial_emotion_images/train/surprise/20512.jpg
Facial_emotion_images/train/surprise/17806.jpg
Facial_emotion_images/train/surprise/2755.jpg
Facial_emotion_images/train/surprise/31550.jpg
Facial_emotion_images/train/surprise/30790.jpg
Facial_emotion_images/train/surprise/1379.jpg
Facial_emotion_images/train/surprise/35211.jpg
Facial_emotion_images/train/surprise/21346.jpg
Facial_emotion_images/train/surprise/9787.jpg
Facial_emotion_images/train/surprise/5941.jpg
Facial_emotion_images/train/surprise/20955.jpg
Facial_emotion_images/train/surprise/14615.jpg
Facial_emotion_images/train/surprise/15808.jpg
Facial_emotion_images/train/surprise/16669.jpg
Facial_emotion_images/train/surprise/24589.jpg
Facial_emotion_images/train/surprise/32176.jpg
Facial_emotion_images/train/surprise/30427.jpg
Facial_emotion_images/train/surprise/18891.jpg
Facial_emotion_images/train/surprise/14844.jpg
Facial_emotion_images/train/surprise/16543.jpg
Facial_emotion_images/train/surprise/20310.jpg
Facial_emotion_images/train/surprise/30596.jpg
Facial_emotion_images/train/surprise/19733.jpg
Facial_emotion_images/train/surprise/28603.jpg
Facial_emotion_images/train/surprise/5481.jpg
Facial_emotion_images/train/surprise/4150.jpg
Facial_emotion_images/train/surprise/20064.jpg
Facial_emotion_images/train/surprise/29180.jpg
Facial_emotion_images/train/surprise/30108.jpg
Facial_emotion_images/train/surprise/13534.jpg
Facial_emotion_images/train/surprise/4728.jpg
Facial_emotion_images/train/surprise/15532.jpg
Facial_emotion_images/train/surprise/27970.jpg
Facial_emotion_images/train/surprise/7949.jpg
Facial_emotion_images/train/surprise/8464.jpg
Facial_emotion_images/train/surprise/20449.jpg
Facial_emotion_images/train/surprise/20624.jpg
Facial_emotion_images/train/surprise/21934.jpg
Facial_emotion_images/train/surprise/21890.jpg
Facial_emotion_images/train/surprise/2475.jpg
Facial_emotion_images/train/surprise/4240.jpg
Facial_emotion_images/train/surprise/30586.jpg
Facial_emotion_images/train/surprise/3181.jpg
Facial_emotion_images/train/surprise/31391.jpg
Facial_emotion_images/train/surprise/20837.jpg
Facial_emotion_images/train/surprise/8574.jpg
Facial_emotion_images/train/surprise/27206.jpg
Facial_emotion_images/train/surprise/19980.jpg
Facial_emotion_images/train/surprise/3003.jpg
Facial_emotion_images/train/surprise/9859.jpg
Facial_emotion_images/train/surprise/35360.jpg
Facial_emotion_images/train/surprise/17327.jpg
Facial_emotion_images/train/surprise/3961.jpg
Facial_emotion_images/train/surprise/3232.jpg
Facial_emotion_images/train/surprise/332.jpg
Facial_emotion_images/train/surprise/17732.jpg
Facial_emotion_images/train/surprise/30518.jpg
Facial_emotion_images/train/surprise/22518.jpg
Facial_emotion_images/train/surprise/17427.jpg
Facial_emotion_images/train/surprise/814.jpg
Facial_emotion_images/train/surprise/21174.jpg
Facial_emotion_images/train/surprise/4815.jpg
Facial_emotion_images/train/surprise/10491.jpg
Facial_emotion_images/train/surprise/19786.jpg
Facial_emotion_images/train/surprise/28881.jpg
Facial_emotion_images/train/surprise/33158.jpg
Facial_emotion_images/train/surprise/17385.jpg
Facial_emotion_images/train/surprise/8297.jpg
Facial_emotion_images/train/surprise/28785.jpg
Facial_emotion_images/train/surprise/1185.jpg
Facial_emotion_images/train/surprise/34738.jpg
Facial_emotion_images/train/surprise/19708.jpg
Facial_emotion_images/train/surprise/4577.jpg
Facial_emotion_images/train/surprise/21446.jpg
Facial_emotion_images/train/surprise/5597.jpg
Facial_emotion_images/train/surprise/8975.jpg
Facial_emotion_images/train/surprise/7860.jpg
Facial_emotion_images/train/surprise/25468.jpg
Facial_emotion_images/train/surprise/1369.jpg
Facial_emotion_images/train/surprise/9127.jpg
Facial_emotion_images/train/surprise/7097.jpg
Facial_emotion_images/train/surprise/9626.jpg
Facial_emotion_images/train/surprise/32824.jpg
Facial_emotion_images/train/surprise/4252.jpg
Facial_emotion_images/train/surprise/29274.jpg
Facial_emotion_images/train/surprise/11631.jpg
Facial_emotion_images/train/surprise/29169.jpg
Facial_emotion_images/train/surprise/11576.jpg
Facial_emotion_images/train/surprise/20767.jpg
Facial_emotion_images/train/surprise/3933.jpg
Facial_emotion_images/train/surprise/328.jpg
Facial_emotion_images/train/surprise/31699.jpg
Facial_emotion_images/train/surprise/27796.jpg
Facial_emotion_images/train/surprise/31686.jpg
Facial_emotion_images/train/surprise/33632.jpg
Facial_emotion_images/train/surprise/12794.jpg
Facial_emotion_images/train/surprise/14414.jpg
Facial_emotion_images/train/surprise/35636.jpg
Facial_emotion_images/train/surprise/8631.jpg
Facial_emotion_images/train/surprise/5020.jpg
Facial_emotion_images/train/surprise/18190.jpg
Facial_emotion_images/train/surprise/22159.jpg
Facial_emotion_images/train/surprise/30387.jpg
Facial_emotion_images/train/surprise/7485.jpg
Facial_emotion_images/train/surprise/24892.jpg
Facial_emotion_images/train/surprise/7256.jpg
Facial_emotion_images/train/surprise/17562.jpg
Facial_emotion_images/train/surprise/33143.jpg
Facial_emotion_images/train/surprise/27028.jpg
Facial_emotion_images/train/surprise/27939.jpg
Facial_emotion_images/train/surprise/21355.jpg
Facial_emotion_images/train/surprise/16365.jpg
Facial_emotion_images/train/surprise/10087.jpg
Facial_emotion_images/train/surprise/9384.jpg
Facial_emotion_images/train/surprise/25968.jpg
Facial_emotion_images/train/surprise/22580.jpg
Facial_emotion_images/train/surprise/34701.jpg
Facial_emotion_images/train/surprise/26678.jpg
Facial_emotion_images/train/surprise/9650.jpg
Facial_emotion_images/train/surprise/26351.jpg
Facial_emotion_images/train/surprise/8152.jpg
Facial_emotion_images/train/surprise/24328.jpg
Facial_emotion_images/train/surprise/14651.jpg
Facial_emotion_images/train/surprise/29771.jpg
Facial_emotion_images/train/surprise/18595.jpg
Facial_emotion_images/train/surprise/18546.jpg
Facial_emotion_images/train/surprise/2034.jpg
Facial_emotion_images/train/surprise/21054.jpg
Facial_emotion_images/train/surprise/10575.jpg
Facial_emotion_images/train/surprise/15491.jpg
Facial_emotion_images/train/surprise/17118.jpg
Facial_emotion_images/train/surprise/35875.jpg
Facial_emotion_images/train/surprise/23527.jpg
Facial_emotion_images/train/surprise/24398.jpg
Facial_emotion_images/train/surprise/29747.jpg
Facial_emotion_images/train/surprise/18111.jpg
Facial_emotion_images/train/surprise/8005.jpg
Facial_emotion_images/train/surprise/11339.jpg
Facial_emotion_images/train/surprise/24151.jpg
Facial_emotion_images/train/surprise/19949.jpg
Facial_emotion_images/train/surprise/23653.jpg
Facial_emotion_images/train/surprise/29763.jpg
Facial_emotion_images/train/surprise/22360.jpg
Facial_emotion_images/train/surprise/32398.jpg
Facial_emotion_images/train/surprise/27034.jpg
Facial_emotion_images/train/surprise/20614.jpg
Facial_emotion_images/train/surprise/8926.jpg
Facial_emotion_images/train/surprise/9839.jpg
Facial_emotion_images/train/surprise/26003.jpg
Facial_emotion_images/train/surprise/34114.jpg
Facial_emotion_images/train/surprise/719.jpg
Facial_emotion_images/train/surprise/35498.jpg
Facial_emotion_images/train/surprise/26575.jpg
Facial_emotion_images/train/surprise/35505.jpg
Facial_emotion_images/train/surprise/24478.jpg
Facial_emotion_images/train/surprise/1528.jpg
Facial_emotion_images/train/surprise/25153.jpg
Facial_emotion_images/train/surprise/7972.jpg
Facial_emotion_images/train/surprise/27396.jpg
Facial_emotion_images/train/surprise/25774.jpg
Facial_emotion_images/train/surprise/15057.jpg
Facial_emotion_images/train/surprise/14567.jpg
Facial_emotion_images/train/surprise/11979.jpg
Facial_emotion_images/train/surprise/35540.jpg
Facial_emotion_images/train/surprise/15937.jpg
Facial_emotion_images/train/surprise/34111.jpg
Facial_emotion_images/train/surprise/17404.jpg
Facial_emotion_images/train/surprise/10849.jpg
Facial_emotion_images/train/surprise/31405.jpg
Facial_emotion_images/train/surprise/5169.jpg
Facial_emotion_images/train/surprise/7388.jpg
Facial_emotion_images/train/surprise/21140.jpg
Facial_emotion_images/train/surprise/1822.jpg
Facial_emotion_images/train/surprise/22848.jpg
Facial_emotion_images/train/surprise/34351.jpg
Facial_emotion_images/train/surprise/13307.jpg
Facial_emotion_images/train/surprise/28761.jpg
Facial_emotion_images/train/surprise/16325.jpg
Facial_emotion_images/train/surprise/33306.jpg
Facial_emotion_images/train/surprise/22975.jpg
Facial_emotion_images/train/surprise/6118.jpg
Facial_emotion_images/train/surprise/22872.jpg
Facial_emotion_images/train/surprise/19556.jpg
Facial_emotion_images/train/surprise/16707.jpg
Facial_emotion_images/train/surprise/12610.jpg
Facial_emotion_images/train/surprise/8325.jpg
Facial_emotion_images/train/surprise/2358.jpg
Facial_emotion_images/train/surprise/20996.jpg
Facial_emotion_images/train/surprise/7736.jpg
Facial_emotion_images/train/surprise/33232.jpg
Facial_emotion_images/train/surprise/13400.jpg
Facial_emotion_images/train/surprise/34956.jpg
Facial_emotion_images/train/surprise/28544.jpg
Facial_emotion_images/train/surprise/24832.jpg
Facial_emotion_images/train/surprise/22825.jpg
Facial_emotion_images/train/surprise/35219.jpg
Facial_emotion_images/train/surprise/32040.jpg
Facial_emotion_images/train/surprise/35662.jpg
Facial_emotion_images/train/surprise/2804.jpg
Facial_emotion_images/train/surprise/28861.jpg
Facial_emotion_images/train/surprise/17431.jpg
Facial_emotion_images/train/surprise/25313.jpg
Facial_emotion_images/train/surprise/33734.jpg
Facial_emotion_images/train/surprise/5703.jpg
Facial_emotion_images/train/surprise/21392.jpg
Facial_emotion_images/train/surprise/24985.jpg
Facial_emotion_images/train/surprise/34817.jpg
Facial_emotion_images/train/surprise/18639.jpg
Facial_emotion_images/train/surprise/21633.jpg
Facial_emotion_images/train/surprise/4158.jpg
Facial_emotion_images/train/surprise/7347.jpg
Facial_emotion_images/train/surprise/13914.jpg
Facial_emotion_images/train/surprise/17322.jpg
Facial_emotion_images/train/surprise/21444.jpg
Facial_emotion_images/train/surprise/17944.jpg
Facial_emotion_images/train/surprise/9164.jpg
Facial_emotion_images/train/surprise/2032.jpg
Facial_emotion_images/train/surprise/6439.jpg
Facial_emotion_images/train/surprise/32925.jpg
Facial_emotion_images/train/surprise/24759.jpg
Facial_emotion_images/train/surprise/18093.jpg
Facial_emotion_images/train/surprise/25699.jpg
Facial_emotion_images/train/surprise/4416.jpg
Facial_emotion_images/train/surprise/17900.jpg
Facial_emotion_images/train/surprise/21507.jpg
Facial_emotion_images/train/surprise/20077.jpg
Facial_emotion_images/train/surprise/12052.jpg
Facial_emotion_images/train/surprise/13507.jpg
Facial_emotion_images/train/surprise/34169.jpg
Facial_emotion_images/train/surprise/24124.jpg
Facial_emotion_images/train/surprise/27877.jpg
Facial_emotion_images/train/surprise/4313.jpg
Facial_emotion_images/train/surprise/13311.jpg
Facial_emotion_images/train/surprise/21969.jpg
Facial_emotion_images/train/surprise/33652.jpg
Facial_emotion_images/train/surprise/8189.jpg
Facial_emotion_images/train/surprise/329.jpg
Facial_emotion_images/train/surprise/751.jpg
Facial_emotion_images/train/surprise/1665.jpg
Facial_emotion_images/train/surprise/9038.jpg
Facial_emotion_images/train/surprise/34472.jpg
Facial_emotion_images/train/surprise/4509.jpg
Facial_emotion_images/train/surprise/10556.jpg
Facial_emotion_images/train/surprise/34923.jpg
Facial_emotion_images/train/surprise/32212.jpg
Facial_emotion_images/train/surprise/31448.jpg
Facial_emotion_images/train/surprise/8426.jpg
Facial_emotion_images/train/surprise/16627.jpg
Facial_emotion_images/train/surprise/18178.jpg
Facial_emotion_images/train/surprise/28891.jpg
Facial_emotion_images/train/surprise/23228.jpg
Facial_emotion_images/train/surprise/28542.jpg
Facial_emotion_images/train/surprise/28268.jpg
Facial_emotion_images/train/surprise/8794.jpg
Facial_emotion_images/train/surprise/11459.jpg
Facial_emotion_images/train/surprise/13331.jpg
Facial_emotion_images/train/surprise/16620.jpg
Facial_emotion_images/train/surprise/30751.jpg
Facial_emotion_images/train/surprise/7193.jpg
In [22]:
#Plot distribution of classes in the training folder
folder_path = "Facial_emotion_images/train/"
determineClassDistributionInFolder(folder_path)
Class Distribution in: Facial_emotion_images/train/
sad: 3917 images
surprise: 2675 images
neutral: 3909 images
happy: 3944 images
No description has been provided for this image
Imbalance Ratio:1.47

Observations and Insights:__

  1. After removing duplicates from the training folder. The classes are almost equally distributed. 27% of the images are neutral, happy, or sad. 18.5% of the images are surprised.
  2. The class imbalance between the class with the most images and the class with the least images is 1.47 now after removing duplicates but still not too severe to prevent training.
In [23]:
#Plot distribution of classes in the validation folder
folder_path = "Facial_emotion_images/validation/"
determineClassDistributionInFolder(folder_path)
Class Distribution in: Facial_emotion_images/validation/
sad: 1139 images
surprise: 797 images
neutral: 1216 images
happy: 1825 images
No description has been provided for this image
Imbalance Ratio:2.29

Observations and Insights:__

  1. In the validation folder, before checking for image duplicates:
  • 24.4% of the faces are neutral
  • 16% of the faces are surprised
  • 36.7% of the faces are happy
  • 22.9% of the faces are sad

The class imbalance between the class with the most images and the class with the least images is 2.29. For validation, this distribution is still acceptable for validating the model.

In [24]:
#Plot distribution of classes in the test folder
folder_path = "Facial_emotion_images/test/"
determineClassDistributionInFolder(folder_path)
Class Distribution in: Facial_emotion_images/test/
sad: 32 images
surprise: 32 images
neutral: 32 images
happy: 32 images
No description has been provided for this image
Imbalance Ratio:1.00

Observations and Insights:__

  1. In the test class, the classes are uniformly distributed with 25% of the images in each folder.
In [25]:
#Determine image duplicates for happy faces in the validation folder
determineImageDuplicates('Facial_emotion_images/validation/happy/')
Duplicate Images:  5
Duplicate: Facial_emotion_images/validation/happy/12672.jpg -> Original:Facial_emotion_images/validation/happy/30424.jpg
Duplicate: Facial_emotion_images/validation/happy/2450.jpg -> Original:Facial_emotion_images/validation/happy/10956.jpg
Duplicate: Facial_emotion_images/validation/happy/11733.jpg -> Original:Facial_emotion_images/validation/happy/20988.jpg
Duplicate: Facial_emotion_images/validation/happy/7815.jpg -> Original:Facial_emotion_images/validation/happy/21120.jpg
Duplicate: Facial_emotion_images/validation/happy/1381.jpg -> Original:Facial_emotion_images/validation/happy/18476.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/validation/happy/12672.jpg -> Original:Facial_emotion_images/validation/happy/30424.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/happy/2450.jpg -> Original:Facial_emotion_images/validation/happy/10956.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/happy/11733.jpg -> Original:Facial_emotion_images/validation/happy/20988.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/happy/7815.jpg -> Original:Facial_emotion_images/validation/happy/21120.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/happy/1381.jpg -> Original:Facial_emotion_images/validation/happy/18476.jpg
No description has been provided for this image
In [26]:
#Determine image duplicates for sad faces in the validation folder
determineImageDuplicates('Facial_emotion_images/validation/sad/')
Duplicate Images:  11
Duplicate: Facial_emotion_images/validation/sad/16125.jpg -> Original:Facial_emotion_images/validation/sad/8876.jpg
Duplicate: Facial_emotion_images/validation/sad/25529.jpg -> Original:Facial_emotion_images/validation/sad/27350.jpg
Duplicate: Facial_emotion_images/validation/sad/20468.jpg -> Original:Facial_emotion_images/validation/sad/12364.jpg
Duplicate: Facial_emotion_images/validation/sad/32189.jpg -> Original:Facial_emotion_images/validation/sad/24013.jpg
Duplicate: Facial_emotion_images/validation/sad/25348.jpg -> Original:Facial_emotion_images/validation/sad/30181.jpg
Duplicate: Facial_emotion_images/validation/sad/17215.jpg -> Original:Facial_emotion_images/validation/sad/29819.jpg
Duplicate: Facial_emotion_images/validation/sad/28465.jpg -> Original:Facial_emotion_images/validation/sad/27350.jpg
Duplicate: Facial_emotion_images/validation/sad/23549.jpg -> Original:Facial_emotion_images/validation/sad/7675.jpg
Duplicate: Facial_emotion_images/validation/sad/8953.jpg -> Original:Facial_emotion_images/validation/sad/24473.jpg
Duplicate: Facial_emotion_images/validation/sad/25843.jpg -> Original:Facial_emotion_images/validation/sad/22989.jpg
Duplicate: Facial_emotion_images/validation/sad/11284.jpg -> Original:Facial_emotion_images/validation/sad/11582.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/validation/sad/16125.jpg -> Original:Facial_emotion_images/validation/sad/8876.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/sad/25529.jpg -> Original:Facial_emotion_images/validation/sad/27350.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/sad/20468.jpg -> Original:Facial_emotion_images/validation/sad/12364.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/sad/32189.jpg -> Original:Facial_emotion_images/validation/sad/24013.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/sad/25348.jpg -> Original:Facial_emotion_images/validation/sad/30181.jpg
No description has been provided for this image
In [27]:
#Determine image duplicates for neutral faces in the validation folder
determineImageDuplicates('Facial_emotion_images/validation/neutral/')
Duplicate Images:  7
Duplicate: Facial_emotion_images/validation/neutral/24798.jpg -> Original:Facial_emotion_images/validation/neutral/28007.jpg
Duplicate: Facial_emotion_images/validation/neutral/5170.jpg -> Original:Facial_emotion_images/validation/neutral/25615.jpg
Duplicate: Facial_emotion_images/validation/neutral/16570.jpg -> Original:Facial_emotion_images/validation/neutral/11130.jpg
Duplicate: Facial_emotion_images/validation/neutral/35356.jpg -> Original:Facial_emotion_images/validation/neutral/18223.jpg
Duplicate: Facial_emotion_images/validation/neutral/27533.jpg -> Original:Facial_emotion_images/validation/neutral/35754.jpg
Duplicate: Facial_emotion_images/validation/neutral/7348.jpg -> Original:Facial_emotion_images/validation/neutral/24931.jpg
Duplicate: Facial_emotion_images/validation/neutral/22774.jpg -> Original:Facial_emotion_images/validation/neutral/7254.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/validation/neutral/24798.jpg -> Original:Facial_emotion_images/validation/neutral/28007.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/neutral/5170.jpg -> Original:Facial_emotion_images/validation/neutral/25615.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/neutral/16570.jpg -> Original:Facial_emotion_images/validation/neutral/11130.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/neutral/35356.jpg -> Original:Facial_emotion_images/validation/neutral/18223.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/neutral/27533.jpg -> Original:Facial_emotion_images/validation/neutral/35754.jpg
No description has been provided for this image
In [28]:
#Determine image duplicates for surpise faces in the validation folder
determineImageDuplicates('Facial_emotion_images/validation/surprise/')
Duplicate Images:  32
Duplicate: Facial_emotion_images/validation/surprise/15802.jpg -> Original:Facial_emotion_images/validation/surprise/10268.jpg
Duplicate: Facial_emotion_images/validation/surprise/31102.jpg -> Original:Facial_emotion_images/validation/surprise/29618.jpg
Duplicate: Facial_emotion_images/validation/surprise/17044.jpg -> Original:Facial_emotion_images/validation/surprise/1515.jpg
Duplicate: Facial_emotion_images/validation/surprise/17161.jpg -> Original:Facial_emotion_images/validation/surprise/10268.jpg
Duplicate: Facial_emotion_images/validation/surprise/26101.jpg -> Original:Facial_emotion_images/validation/surprise/9141.jpg
Duplicate: Facial_emotion_images/validation/surprise/28667.jpg -> Original:Facial_emotion_images/validation/surprise/20162.jpg
Duplicate: Facial_emotion_images/validation/surprise/9162.jpg -> Original:Facial_emotion_images/validation/surprise/21807.jpg
Duplicate: Facial_emotion_images/validation/surprise/22666.jpg -> Original:Facial_emotion_images/validation/surprise/18038.jpg
Duplicate: Facial_emotion_images/validation/surprise/35384.jpg -> Original:Facial_emotion_images/validation/surprise/28901.jpg
Duplicate: Facial_emotion_images/validation/surprise/29515.jpg -> Original:Facial_emotion_images/validation/surprise/29118.jpg
Duplicate: Facial_emotion_images/validation/surprise/15486.jpg -> Original:Facial_emotion_images/validation/surprise/35049.jpg
Duplicate: Facial_emotion_images/validation/surprise/25674.jpg -> Original:Facial_emotion_images/validation/surprise/14305.jpg
Duplicate: Facial_emotion_images/validation/surprise/10866.jpg -> Original:Facial_emotion_images/validation/surprise/21578.jpg
Duplicate: Facial_emotion_images/validation/surprise/4536.jpg -> Original:Facial_emotion_images/validation/surprise/30190.jpg
Duplicate: Facial_emotion_images/validation/surprise/867.jpg -> Original:Facial_emotion_images/validation/surprise/34288.jpg
Duplicate: Facial_emotion_images/validation/surprise/16829.jpg -> Original:Facial_emotion_images/validation/surprise/19362.jpg
Duplicate: Facial_emotion_images/validation/surprise/15524.jpg -> Original:Facial_emotion_images/validation/surprise/13101.jpg
Duplicate: Facial_emotion_images/validation/surprise/27737.jpg -> Original:Facial_emotion_images/validation/surprise/4793.jpg
Duplicate: Facial_emotion_images/validation/surprise/2119.jpg -> Original:Facial_emotion_images/validation/surprise/4036.jpg
Duplicate: Facial_emotion_images/validation/surprise/16530.jpg -> Original:Facial_emotion_images/validation/surprise/27270.jpg
Duplicate: Facial_emotion_images/validation/surprise/31198.jpg -> Original:Facial_emotion_images/validation/surprise/21217.jpg
Duplicate: Facial_emotion_images/validation/surprise/18678.jpg -> Original:Facial_emotion_images/validation/surprise/32324.jpg
Duplicate: Facial_emotion_images/validation/surprise/22372.jpg -> Original:Facial_emotion_images/validation/surprise/16980.jpg
Duplicate: Facial_emotion_images/validation/surprise/2461.jpg -> Original:Facial_emotion_images/validation/surprise/31563.jpg
Duplicate: Facial_emotion_images/validation/surprise/8973.jpg -> Original:Facial_emotion_images/validation/surprise/30625.jpg
Duplicate: Facial_emotion_images/validation/surprise/23751.jpg -> Original:Facial_emotion_images/validation/surprise/35688.jpg
Duplicate: Facial_emotion_images/validation/surprise/6518.jpg -> Original:Facial_emotion_images/validation/surprise/35118.jpg
Duplicate: Facial_emotion_images/validation/surprise/28130.jpg -> Original:Facial_emotion_images/validation/surprise/2837.jpg
Duplicate: Facial_emotion_images/validation/surprise/26487.jpg -> Original:Facial_emotion_images/validation/surprise/8143.jpg
Duplicate: Facial_emotion_images/validation/surprise/4685.jpg -> Original:Facial_emotion_images/validation/surprise/5077.jpg
Duplicate: Facial_emotion_images/validation/surprise/27586.jpg -> Original:Facial_emotion_images/validation/surprise/20041.jpg
Duplicate: Facial_emotion_images/validation/surprise/20167.jpg -> Original:Facial_emotion_images/validation/surprise/4347.jpg
Example of 5 duplicate images:
Duplicate: Facial_emotion_images/validation/surprise/15802.jpg -> Original:Facial_emotion_images/validation/surprise/10268.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/surprise/31102.jpg -> Original:Facial_emotion_images/validation/surprise/29618.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/surprise/17044.jpg -> Original:Facial_emotion_images/validation/surprise/1515.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/surprise/17161.jpg -> Original:Facial_emotion_images/validation/surprise/10268.jpg
No description has been provided for this image
Duplicate: Facial_emotion_images/validation/surprise/26101.jpg -> Original:Facial_emotion_images/validation/surprise/9141.jpg
No description has been provided for this image

Observations¶

  1. There are 5 duplicate pictures in the validation happy face folder
  2. There are 11 duplicate pictures in the validation sad face folder
  3. There are 7 duplicate pictures in the validation neutral face folder
  4. There are 32 duplicate pictures in the validation neutral face folder
In [29]:
#Remove duplicates from the validation happy face folder
removeDuplicates('Facial_emotion_images/validation/happy/')
Total duplicates removed: 5
Removed files:
Facial_emotion_images/validation/happy/12672.jpg
Facial_emotion_images/validation/happy/2450.jpg
Facial_emotion_images/validation/happy/11733.jpg
Facial_emotion_images/validation/happy/7815.jpg
Facial_emotion_images/validation/happy/1381.jpg
In [30]:
#Remove duplicates from the validation sad face folder
removeDuplicates('Facial_emotion_images/validation/sad/')
Total duplicates removed: 11
Removed files:
Facial_emotion_images/validation/sad/16125.jpg
Facial_emotion_images/validation/sad/25529.jpg
Facial_emotion_images/validation/sad/20468.jpg
Facial_emotion_images/validation/sad/32189.jpg
Facial_emotion_images/validation/sad/25348.jpg
Facial_emotion_images/validation/sad/17215.jpg
Facial_emotion_images/validation/sad/28465.jpg
Facial_emotion_images/validation/sad/23549.jpg
Facial_emotion_images/validation/sad/8953.jpg
Facial_emotion_images/validation/sad/25843.jpg
Facial_emotion_images/validation/sad/11284.jpg
In [31]:
#Remove duplicates from the validation neutral face folder
removeDuplicates('Facial_emotion_images/validation/neutral/')
Total duplicates removed: 7
Removed files:
Facial_emotion_images/validation/neutral/24798.jpg
Facial_emotion_images/validation/neutral/5170.jpg
Facial_emotion_images/validation/neutral/16570.jpg
Facial_emotion_images/validation/neutral/35356.jpg
Facial_emotion_images/validation/neutral/27533.jpg
Facial_emotion_images/validation/neutral/7348.jpg
Facial_emotion_images/validation/neutral/22774.jpg
In [32]:
#Remove duplicates from the validation surprise face folder
removeDuplicates('Facial_emotion_images/validation/surprise/')
Total duplicates removed: 32
Removed files:
Facial_emotion_images/validation/surprise/15802.jpg
Facial_emotion_images/validation/surprise/31102.jpg
Facial_emotion_images/validation/surprise/17044.jpg
Facial_emotion_images/validation/surprise/17161.jpg
Facial_emotion_images/validation/surprise/26101.jpg
Facial_emotion_images/validation/surprise/28667.jpg
Facial_emotion_images/validation/surprise/9162.jpg
Facial_emotion_images/validation/surprise/22666.jpg
Facial_emotion_images/validation/surprise/35384.jpg
Facial_emotion_images/validation/surprise/29515.jpg
Facial_emotion_images/validation/surprise/15486.jpg
Facial_emotion_images/validation/surprise/25674.jpg
Facial_emotion_images/validation/surprise/10866.jpg
Facial_emotion_images/validation/surprise/4536.jpg
Facial_emotion_images/validation/surprise/867.jpg
Facial_emotion_images/validation/surprise/16829.jpg
Facial_emotion_images/validation/surprise/15524.jpg
Facial_emotion_images/validation/surprise/27737.jpg
Facial_emotion_images/validation/surprise/2119.jpg
Facial_emotion_images/validation/surprise/16530.jpg
Facial_emotion_images/validation/surprise/31198.jpg
Facial_emotion_images/validation/surprise/18678.jpg
Facial_emotion_images/validation/surprise/22372.jpg
Facial_emotion_images/validation/surprise/2461.jpg
Facial_emotion_images/validation/surprise/8973.jpg
Facial_emotion_images/validation/surprise/23751.jpg
Facial_emotion_images/validation/surprise/6518.jpg
Facial_emotion_images/validation/surprise/28130.jpg
Facial_emotion_images/validation/surprise/26487.jpg
Facial_emotion_images/validation/surprise/4685.jpg
Facial_emotion_images/validation/surprise/27586.jpg
Facial_emotion_images/validation/surprise/20167.jpg
In [33]:
#Plot distribution of classes in the validation folder
folder_path = "Facial_emotion_images/validation/"
determineClassDistributionInFolder(folder_path)
Class Distribution in: Facial_emotion_images/validation/
sad: 1128 images
surprise: 765 images
neutral: 1209 images
happy: 1820 images
No description has been provided for this image
Imbalance Ratio:2.38

Observations and Insights:__

  1. In the validation folder, after removing image duplicates:
  • 24.6% of the faces are neutral
  • 15.5% of the faces are surprised
  • 37% of the faces are happy
  • 22.9% of the faces are sad

The class imbalance between the class with the most images and the class with the least images is 2.38. For validation, this distribution is still acceptable for validating the model.

In [34]:
#Determine image duplicates for happy faces in the test folder
determineImageDuplicates('Facial_emotion_images/test/happy/')
Duplicate Images:  0
Example of 5 duplicate images:
In [35]:
#Determine image duplicates for sad faces in the test folder
determineImageDuplicates('Facial_emotion_images/test/sad/')
Duplicate Images:  0
Example of 5 duplicate images:
In [36]:
#Determine image duplicates for neutral faces in the test folder
determineImageDuplicates('Facial_emotion_images/test/neutral/')
Duplicate Images:  0
Example of 5 duplicate images:
In [37]:
#Determine image duplicates for surprise faces in the test folder
determineImageDuplicates('Facial_emotion_images/test/surprise/')
Duplicate Images:  0
Example of 5 duplicate images:

Observations¶

  1. There are no duplicates in the test folder and there is uniform class distribution for the test data sets.

Creating our Data Loaders¶

In this section, we are creating data loaders that we will use as inputs to our Neural Network.

You have two options for the color_mode. You can set it to color_mode = 'rgb' or color_mode = 'grayscale'. You will need to try out both and see for yourself which one gives better performance.

In [38]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="grayscale",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.
In [39]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)

Model Building¶

Think About It:

  • Are Convolutional Neural Networks the right approach? Should we have gone with Artificial Neural Networks instead?
  • What are the advantages of CNNs over ANNs and are they applicable here?

Yes, Convolutional Neural Networks are the right approach. We should not use an ANN for this task because it would be too computationally expensive just to make the ANN learn that locality is important in the dataset - it would see lists of pixels with no spatial context. A CNN is like a fully connected ANN that has the nonlocal connections pruned ahead of training because we know that they are unlikely to contribute much relevant information.
The advantages of CNNs are:

  1. that they enforce an inductive bias for spatial locality
  2. efficient weight sharing
  3. translational invariance
    Images make sense to us because they have a hierarchy of spatially local features. At the lowest level, this includes simple edges and corners. To detect a small edge, a neural net does not need information from pixels on the other side of the image, so the connections of a neuron to all pixels would be wasteful multiply-accumulate operations. Instead, a CNN allows the network to learn a local filter that can detect the same type of localized features wherever that filter "looks" as it slides across the image.

The advantages of CNNs are definitely applicable for this facial recognition task because

  1. we are working with image data.
  2. facial features are a hierarchy of abstractions, starting from simple edges and curves that could occur in various locations, and up to complex shapes like wide open eyes or frowning mouth.
  3. Pooling layers help to efficiently process this hierarchy by making filters that reach to longer ranges, but still relatively localized at some scale that is smaller than the full image.
  4. a facial feature could be in several sections of the image for different input face images, so the translational invariance helps to efficiently detect the feature no matter which pixels are part of it.

Creating the Base Neural Network¶

First Convolutional Neural Network Model Architecture¶

  • Write a function that returns a sequential model with the following architecture:
  • First Convolutional layer with 64 filters and the kernel size of 3x3. Use the 'same' padding and provide the input shape = (48, 48, 1). We will start by modeling grayscale images.
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Second Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Third Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Flatten the output from the previous layer
  • Add a dense layer with 512 nodes
  • Add a relu activation layer
  • Add a dropout layer with the rate equal to 0.4
  • Add the final output layer with nodes equal to the number of classes, i.e., 4 and 'softmax' as the activation function
  • Compile the model with the categorical_crossentropy loss, adam optimizers (learning_rate = 0.001), and metric equal to 'accuracy'. Do not fit the model here, just return the compiled model.
In [40]:
#method to create a convolutional neural network
def cnn_model_1():
  model = Sequential()

  #Add first Conv2D layer with 64 filters, kernel of size 3, same padding and provide input shape
  model.add(Conv2D(filters=64, kernel_size=(3,3), padding = 'same', input_shape = (48,48,1)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add second Conv2D layer with 32 filters, kernel of size 3, same padding and 'relu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add third Conv2D layer with 32 filters, kernel of size 3, same padding and 'relu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Flatten the data to prepare for the fully connected component
  model.add(Flatten())
  #Add dense layer with 512 neurons and relu activation function, dropout of 0.4
  model.add(Dense(512))
  model.add(Activation('relu'))
  model.add(Dropout(0.4))
  #Add classification layer
  model.add(Dense(4, activation = 'softmax'))
  model.compile(optimizer = Adam(learning_rate=0.001),
                loss = 'categorical_crossentropy',
                metrics = ['accuracy'])
  return model

Compiling and Training the Model¶

In [41]:
#Create first cnn model and publish summary
cnn_model_1 = cnn_model_1()

cnn_model_1.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                      │ (None, 48, 48, 64)          │             640 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation (Activation)              │ (None, 48, 48, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d (MaxPooling2D)         │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_1 (Conv2D)                    │ (None, 24, 24, 32)          │          18,464 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_1 (Activation)            │ (None, 24, 24, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_1 (MaxPooling2D)       │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_2 (Conv2D)                    │ (None, 12, 12, 32)          │           9,248 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_2 (Activation)            │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_2 (MaxPooling2D)       │ (None, 6, 6, 32)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_2 (Dropout)                  │ (None, 6, 6, 32)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten (Flatten)                    │ (None, 1152)                │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)                        │ (None, 512)                 │         590,336 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_3 (Activation)            │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_3 (Dropout)                  │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 4)                   │           2,052 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 620,740 (2.37 MB)
 Trainable params: 620,740 (2.37 MB)
 Non-trainable params: 0 (0.00 B)

Observations¶

The model has:

  1. The first convolutional layer of the CNN has 64(filters) x (3 x 3 x 1) + 64 parameters = 640. Padding is 'same' so the input and output size are matched. The relu layer applies an element-wise activation function to the input and has no learnable parameters.
  2. The input size is 48 x 48 x 1. We are fitting the gray scale image.
  3. We add a max-pooling layer with a pool size of 2x2 and a dropout layer with the rate equal to 0.2. These layers have no parameters
  4. The second Conv2D layer has 32 x (3 x 3 x 64 + 1) = 18464 parameters
  5. We add a max-pooling layer with a pool size of 2x2 and a dropout layer with the rate equal to 0.2. These layers have no parameters
  6. The third Conv2D layer has 32 x (3 x 3 x 32 + 1) = 9248 parameters
  7. We add a max-pooling layer with a pool size of 2x2 and a dropout layer with the rate equal to 0.2. These layers have no parameters
  8. We flatten the output from the previous layer.
  9. The dense layer has 512 x 6 x 6 x 32 + 512 = 590, 336 parameters
  10. The classification layer has 4 x 512 + 4 = 2052 parameters
In [42]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./cnn_model_1.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20

Evaluating the Model on the Test Set¶

In [43]:
#Fitting the model
cnn_model_1_history = cnn_model_1.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 30s 191ms/step - accuracy: 0.2699 - loss: 1.3855 - val_accuracy: 0.4393 - val_loss: 1.3110
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.3799 - loss: 1.2955 - val_accuracy: 0.5010 - val_loss: 1.1769
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.4544 - loss: 1.2078 - val_accuracy: 0.5325 - val_loss: 1.0831
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.4996 - loss: 1.1327 - val_accuracy: 0.5868 - val_loss: 1.0113
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5287 - loss: 1.0803 - val_accuracy: 0.6032 - val_loss: 0.9532
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5563 - loss: 1.0372 - val_accuracy: 0.5961 - val_loss: 0.9688
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5521 - loss: 1.0330 - val_accuracy: 0.6166 - val_loss: 0.9183
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5759 - loss: 0.9933 - val_accuracy: 0.6333 - val_loss: 0.8726
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.5735 - loss: 0.9781 - val_accuracy: 0.6489 - val_loss: 0.8637
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.5806 - loss: 0.9599 - val_accuracy: 0.6605 - val_loss: 0.8260
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5970 - loss: 0.9383 - val_accuracy: 0.6593 - val_loss: 0.8287
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6101 - loss: 0.9164 - val_accuracy: 0.6627 - val_loss: 0.7980
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6186 - loss: 0.8945 - val_accuracy: 0.6759 - val_loss: 0.7868
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6314 - loss: 0.8722 - val_accuracy: 0.6812 - val_loss: 0.7834
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6259 - loss: 0.8744 - val_accuracy: 0.6737 - val_loss: 0.7799
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.6466 - loss: 0.8469 - val_accuracy: 0.6942 - val_loss: 0.7439
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6440 - loss: 0.8441 - val_accuracy: 0.6887 - val_loss: 0.7580
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.6497 - loss: 0.8231 - val_accuracy: 0.6950 - val_loss: 0.7365
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 13s 113ms/step - accuracy: 0.6535 - loss: 0.8310 - val_accuracy: 0.6993 - val_loss: 0.7413
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.6526 - loss: 0.8217 - val_accuracy: 0.7030 - val_loss: 0.7267
In [44]:
#Save training history
with open("cnn_model_1_training_history.json","w") as f:
  json.dump(cnn_model_1_history.history,f)

#Load training history
with open("cnn_model_1_training_history.json","r") as f:
  cnn_model_1_restored_history = json.load(f)

#save the trained model
cnn_model_1.save("cnn_model_1.keras")

cnn_model_1_restored = load_model("cnn_model_1.keras")

Plot the Training and Validation Accuracies¶

In [45]:
#plot training and validation accuracies and loss
dict_hist = cnn_model_1_restored_history

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))

plt.plot(list_epoch, dict_hist['accuracy'], ls = '--', label = 'cnn_model_1_accuracy')
plt.plot(list_epoch, dict_hist['val_accuracy'], ls = '--', label = 'cnn_model_1_validation_accuracy')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_1_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist['loss'], ls='-.', label='cnn_model_1_loss')
plt.plot(list_epoch, dict_hist['val_loss'], ls='-.', label='cnn_model_1_validation_loss')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_1_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Observations and Insights:__

  1. The training accuracy increases with each epoch and the loss decreases with each epoch
  2. The validation accuracy is better than the training accuracy across all epochs. The validation loss is also better than the training loss across all epochs. This shows that the model is generalizing well on unseen data.
  3. The best accuracy achieved in training is about 65%. The best accuracy on validation is 70%
In [46]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy = cnn_model_1_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy}")
4/4 - 2s - 591ms/step - accuracy: 0.7578 - loss: 0.6845
Model accuracy on the test batch:[0.6844899654388428, 0.7578125]

Observations and Insights:__

  1. The accuracy on test data is 75.8% which is in good agreement with the training and validation results
In [77]:
#Define a method to evaluate model accuracy
def metrics_score(actual,predicted,name):
  from sklearn.metrics import classification_report
  from sklearn.metrics import confusion_matrix
  print(classification_report(actual, predicted))

  class_names = {v:k for k, v in train_set.class_indices.items()}

  cm = confusion_matrix(actual, predicted)
  plt.figure(figsize=(4,4))
  sns.heatmap(cm, annot=True, fmt = '0.0f',
              xticklabels = class_names.values(),
              yticklabels = class_names.values())
  plt.ylabel('Actual')
  plt.xlabel('Predicted')
  plt.savefig(name+'confMatrix.png', format="png", dpi=300, bbox_inches="tight")

  plt.show()
In [48]:
pred = cnn_model_1_restored.predict(test_images)
pred = np.argmax(pred, axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step  
In [49]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [50]:
#plot confusion matrix from the first model
metrics_score(y_true,pred)
              precision    recall  f1-score   support

           0       0.79      0.84      0.82        32
           1       0.61      0.72      0.66        32
           2       0.72      0.72      0.72        32
           3       1.00      0.75      0.86        32

    accuracy                           0.76       128
   macro avg       0.78      0.76      0.76       128
weighted avg       0.78      0.76      0.76       128

No description has been provided for this image

Observations and Insights:__

  1. Sad and neutral faces show the lowest f1 scores of 66% and 72% respectively.
  2. Surprise faces have the best f1 score of 86%
  3. Actual neutral faces can be inaccurately classified as sad. Similarly, actual sad faces can be inaccurately classified as neutral
In [79]:
def visualizeImages(model, channels, name):
  #Visualize images from the test data, their true values and the classification from the model
  plot_test_images = []
  num_images_to_plot = 9
  plt.figure(figsize=(10,10))

  test_folder = 'Facial_emotion_images/test/'
  model = model
  class_names = {v:k for k, v in train_set.class_indices.items()}


  def preprocess_and_predict(img_path, model, class_names):
    img = tf.io.read_file(img_path)
    img = tf.image.decode_image(img, channels=channels)
    img = tf.image.resize(img, (48,48))
    img = img/255.0
    img = tf.expand_dims(img, axis=0)

    #predict class
    predictions = model.predict(img)[0]
    predicted_index = tf.argmax(predictions).numpy()
    predicted_class = class_names[predicted_index]
    predicted_probability = predictions[predicted_index]
    return img[0].numpy(), predicted_class, predicted_probability


  for class_folder in os.listdir(test_folder):
    class_folder_path = os.path.join(test_folder,class_folder)
    if(os.path.isdir(class_folder_path)):
      plot_test_images.extend(
          [os.path.join(class_folder_path,img) for img in os.listdir(class_folder_path)]
      )

  random_images = np.random.choice(plot_test_images, size=num_images_to_plot, replace=False)

  #plot images
  for i, img_path in enumerate(random_images):
    actual_class = os.path.basename(os.path.dirname(img_path))
    img, predicted_class, predicted_probability = preprocess_and_predict(img_path,model,class_names)
    plt.subplot(3,3,i+1)
    plt.imshow(img)
    plt.title(f"Actual: {actual_class} \nPredicted: {predicted_class} ({predicted_probability:.2f})")
    plt.axis("off")

  plt.tight_layout()
  plt.savefig(name+'_classification', format="png", dpi=300, bbox_inches="tight")
  plt.show()
In [80]:
visualizeImages(cnn_model_1,1,'CNN_Model1')
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
No description has been provided for this image

Observations and Insights:__

  1. Examples of classified faces are shown above. Correct classification tends to show high probability of assignment, while misclassifications tend to show low probabilities. This is encouraging.
  2. The model struggles to distinguish sad verses neutral faces.

Train the same model using RGB images and see if the predictions improve¶

In [53]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [54]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="rgb",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.

Second Convolutional Neural Network Model Architecture¶

  • Write a function that returns a sequential model with the following architecture:
  • First Convolutional layer with 64 filters and the kernel size of 3x3. Use the 'same' padding and provide the input shape = (48, 48, 3). We will start by modeling rgb images.
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Second Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Third Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a relu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Flatten the output from the previous layer
  • Add a dense layer with 512 nodes
  • Add a relu activation layer
  • Add a dropout layer with the rate equal to 0.4
  • Add the final output layer with nodes equal to the number of classes, i.e., 4 and 'softmax' as the activation function
  • Compile the model with the categorical_crossentropy loss, adam optimizers (learning_rate = 0.001), and metric equal to 'accuracy'. Do not fit the model here, just return the compiled model.
In [55]:
#method to create a convolutional neural network
def cnn_model_2():
  model = Sequential()

  #Add first Conv2D layer with 64 filters, kernel of size 3, same padding and provide input shape
  model.add(Conv2D(filters=64, kernel_size=(3,3), padding = 'same', input_shape = (48,48,3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add second Conv2D layer with 32 filters, kernel of size 3, same padding and 'relu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add third Conv2D layer with 32 filters, kernel of size 3, same padding and 'relu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Flatten the data to prepare for the fully connected component
  model.add(Flatten())
  #Add dense layer with 512 neurons and relu activation function, dropout of 0.4
  model.add(Dense(512))
  model.add(Activation('relu'))
  model.add(Dropout(0.4))
  #Add classification layer
  model.add(Dense(4, activation = 'softmax'))
  model.compile(optimizer = Adam(learning_rate=0.001),
                loss = 'categorical_crossentropy',
                metrics = ['accuracy'])
  return model
In [56]:
#Create first cnn model and publish summary
cnn_model_2 = cnn_model_2()

cnn_model_2.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                      │ (None, 48, 48, 64)          │           1,792 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation (Activation)              │ (None, 48, 48, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d (MaxPooling2D)         │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_1 (Conv2D)                    │ (None, 24, 24, 32)          │          18,464 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_1 (Activation)            │ (None, 24, 24, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_1 (MaxPooling2D)       │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_2 (Conv2D)                    │ (None, 12, 12, 32)          │           9,248 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_2 (Activation)            │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_2 (MaxPooling2D)       │ (None, 6, 6, 32)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_2 (Dropout)                  │ (None, 6, 6, 32)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten (Flatten)                    │ (None, 1152)                │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)                        │ (None, 512)                 │         590,336 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_3 (Activation)            │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_3 (Dropout)                  │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 4)                   │           2,052 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 621,892 (2.37 MB)
 Trainable params: 621,892 (2.37 MB)
 Non-trainable params: 0 (0.00 B)

Observations¶

This model is exactly the same as CNN Model 1 except for the use of rgb images as input:

  1. The first convolutional layer of the CNN has 64(filters) x (3 x 3 x 3) + 64 parameters = 1792. Padding is 'same' so the input and output size are matched. The relu layer applies an element-wise activation function to the input and has no learnable parameters.
  2. The input size is 48 x 48 x 3. We are fitting the rgb image.
  3. The second Conv2D layer has 32 x (3 x 3 x 64 + 1) = 18464 parameters
  4. The third Conv2D layer has 32 x (3 x 3 x 32 + 1) = 9248 parameters
  5. The dense layer has 512 x 6 x 6 x 32 + 512 = 590, 336 parameters
  6. The classification layer has 4 x 512 + 4 = 2052 parameters

*The only difference in model architecture to the first model trained is the use of rgb images compared to grayscale

In [57]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./cnn_model_2.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [58]:
#Fitting the model
cnn_model_2_history = cnn_model_2.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 30s 212ms/step - accuracy: 0.2820 - loss: 1.3806 - val_accuracy: 0.3539 - val_loss: 1.3182
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.4081 - loss: 1.2749 - val_accuracy: 0.5299 - val_loss: 1.1280
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 172ms/step - accuracy: 0.4729 - loss: 1.1773 - val_accuracy: 0.5746 - val_loss: 1.0270
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 172ms/step - accuracy: 0.5141 - loss: 1.1084 - val_accuracy: 0.6028 - val_loss: 0.9852
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5322 - loss: 1.0703 - val_accuracy: 0.6124 - val_loss: 0.9267
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.5505 - loss: 1.0270 - val_accuracy: 0.6211 - val_loss: 0.8988
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.5620 - loss: 1.0060 - val_accuracy: 0.6487 - val_loss: 0.8689
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5817 - loss: 0.9689 - val_accuracy: 0.6445 - val_loss: 0.8596
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.5969 - loss: 0.9511 - val_accuracy: 0.6644 - val_loss: 0.8189
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6081 - loss: 0.9250 - val_accuracy: 0.6692 - val_loss: 0.8090
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6087 - loss: 0.9164 - val_accuracy: 0.6835 - val_loss: 0.7946
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6212 - loss: 0.8898 - val_accuracy: 0.6749 - val_loss: 0.7879
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6290 - loss: 0.8687 - val_accuracy: 0.6920 - val_loss: 0.7537
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6340 - loss: 0.8621 - val_accuracy: 0.6883 - val_loss: 0.7687
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6383 - loss: 0.8441 - val_accuracy: 0.6977 - val_loss: 0.7424
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6529 - loss: 0.8346 - val_accuracy: 0.6952 - val_loss: 0.7443
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6576 - loss: 0.8190 - val_accuracy: 0.7034 - val_loss: 0.7487
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6613 - loss: 0.8117 - val_accuracy: 0.7007 - val_loss: 0.7441
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6599 - loss: 0.8055 - val_accuracy: 0.7042 - val_loss: 0.7426
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6713 - loss: 0.7871 - val_accuracy: 0.7050 - val_loss: 0.7368
In [59]:
#Save training history
with open("cnn_model_2_training_history.json","w") as f:
  json.dump(cnn_model_2_history.history,f)

#Load training history
with open("cnn_model_2_training_history.json","r") as f:
  cnn_model_2_restored_history = json.load(f)

#save the trained model
cnn_model_2.save("cnn_model_2.keras")

cnn_model_2_restored = load_model("cnn_model_2.keras")
In [60]:
#plot training and validation accuracies and loss
dict_hist_2 = cnn_model_2_restored_history

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))

plt.plot(list_epoch, dict_hist['accuracy'], ls = '--', label = 'cnn_model_1_accuracy_grayscale')
plt.plot(list_epoch, dict_hist['val_accuracy'], ls = '--', label = 'cnn_model_1_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_2['accuracy'], label = 'cnn_model_2_accuracy_rgb')
plt.plot(list_epoch, dict_hist_2['val_accuracy'], label = 'cnn_model_2_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_1_acc_rgbvsgray.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist['loss'], ls='-.', label='cnn_model_1_loss_grayscale')
plt.plot(list_epoch, dict_hist['val_loss'], ls='-.', label='cnn_model_1_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_2['loss'],  label='cnn_model_2_loss_rgb')
plt.plot(list_epoch, dict_hist_2['val_loss'],  label='cnn_model_2_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_1_loss_rgbvsgray.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Observations and Insights:__

  1. Model accuracy and loss is matched for training and validation using rgb images verses grayscale.
  2. The rgb model had slightly more parameters and took 7 minutes to train verses 4 minutes for the same model trained on gray scale images. Training was on GPU.

Conclusions: For this data set there is no advantage to using color images verses grayscale

In [61]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy = cnn_model_2_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy}")
4/4 - 2s - 382ms/step - accuracy: 0.7188 - loss: 0.6951
Model accuracy on the test batch:[0.6951066851615906, 0.71875]

Observations and Insights:__

  1. The accuracy on test data decreases from 75.8% (model trained on grayscale images) to 71.8% for the model training on rgb images.
In [62]:
pred_cnn_model_2 = cnn_model_2_restored.predict(test_images)
pred_cnn_model_2 = np.argmax(pred_cnn_model_2, axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step  
In [63]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [64]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_cnn_model_2)
              precision    recall  f1-score   support

           0       0.81      0.91      0.85        32
           1       0.62      0.41      0.49        32
           2       0.55      0.75      0.63        32
           3       0.96      0.81      0.88        32

    accuracy                           0.72       128
   macro avg       0.73      0.72      0.71       128
weighted avg       0.73      0.72      0.71       128

No description has been provided for this image

Observations and Insights:__

  1. The model accuracy for training on RGB images is 71.8% which is lower than accuracy observed for the same model trained on gray scale images (75.8%). The f1 score for sad classification is 49% (model trained on rgb images) verses 66% (observed when model was trained on grayscale images). The f1 score for neutral faces is 63% (rgb model) verses 72% (grayscale model)

Conclusions: For this data set, training on rgb images results in low f1 scores for sad and neutral faces. The compute time was a bit longer for rgb images (7 minutes on GPU) verses 4 minutes on GPU for grayscale images. There is no advantage to using RGB images for training. Let us check the nature of the input images.

In [65]:
#Check the image mode for provided images
def check_image_mode_pillow(path):
  image_count = 0

  for file_name in os.listdir(path):
    image_path = os.path.join(path,file_name)

    img = Image.open(image_path)
    print(f"Image mode: {img.mode}")
    if img.mode == "L":
      print("The image is grayscale")
    elif img.mode == "RGB":
      print("The image is RGB.")
    else:
      print(f"Unsupported mode: {img.mode}")

    #Increment the counter
    image_count+=1

    if image_count >= 5:
      break

check_image_mode_pillow("Facial_emotion_images/train/surprise")
Image mode: L
The image is grayscale
Image mode: L
The image is grayscale
Image mode: L
The image is grayscale
Image mode: L
The image is grayscale
Image mode: L
The image is grayscale

Observations and Insights:__
When we examine the nature of the images, they are grayscale. If possible, we should train the models on grayscale images.

In [66]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [67]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="grayscale",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.

Creating the Third Convolutional Neural Network¶

Try out a slightly larger architecture. Main updates are:

  1. Increasing depth to learn hierarchical features, starting from edges and textures in shallow layers to complex shapes and emotional patterns in deeper layers.
  2. Experiment with silu (similar to swish) activation function. This smooth activation function can outperform ReLU in certain architectures. The trade-off is compute complexity.
  3. Add Batch Normalization to improve training stability.

Third Convolutional Neural Network Model Architecture¶

  • Write a function that returns a sequential model with the following architecture:
  • First Convolutional layer with 64 filters and the kernel size of 3x3. Use the 'same' padding and provide the input shape = (48, 48, 1). We will start by modeling grayscale images.
  • Add a silu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Second Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a silu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Add a batch normalization layer
  • Third Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a silu activation layer
  • Add a dropout layer with the rate equal to 0.2
  • Fourth Convolutional layer with 32 filters and the kernel size of 3x3 with 'same' padding
  • Add a silu activation layer
  • Add a max-pooling layer with a pool size of 2x2
  • Add a dropout layer with the rate equal to 0.2
  • Add a batch normalization layer
  • Flatten the output from the previous layer
  • Add a dense layer with 512 nodes with L2 regularization of 0.01
  • Add a silu activation layer
  • Add a dropout layer with the rate equal to 0.4
  • Add the final output layer with nodes equal to the number of classes, i.e., 4 and 'softmax' as the activation function
  • Compile the model with the categorical_crossentropy loss, adam optimizers (learning_rate = 0.001), and metric equal to 'accuracy'. Do not fit the model here, just return the compiled model.
In [68]:
#method to create a convolutional neural network
def cnn_model_3():
  model = Sequential()

  #Add first Conv2D layer with 64 filters, kernel of size 3, same padding and provide input shape
  model.add(Conv2D(filters=64, kernel_size=(3,3), padding = 'same', input_shape = (48,48,1)))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add second Conv2D layer with 32 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add third Conv2D layer with 32 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=32, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  #Add fourth Conv2D layer with 32 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=16, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add Batch Normalization
  model.add(BatchNormalization())
  #Flatten the data to prepare for the fully connected component
  model.add(Flatten())
  #Add dense layer with 512 neurons and relu activation function, dropout of 0.4
  model.add(Dense(512))
  model.add(Activation('silu'))
  model.add(Dropout(0.4))
  #Add classification layer
  model.add(Dense(4, activation = 'softmax'))
  model.compile(optimizer = Adam(learning_rate=0.001),
                loss = 'categorical_crossentropy',
                metrics = ['accuracy'])
  return model

Compiling and Training the Model¶

In [69]:
#Create first cnn model and publish summary
cnn_model_3 = cnn_model_3()

cnn_model_3.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                      │ (None, 48, 48, 64)          │             640 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation (Activation)              │ (None, 48, 48, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d (MaxPooling2D)         │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_1 (Conv2D)                    │ (None, 24, 24, 32)          │          18,464 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_1 (Activation)            │ (None, 24, 24, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_1 (MaxPooling2D)       │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_2 (Conv2D)                    │ (None, 12, 12, 32)          │           9,248 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_2 (Activation)            │ (None, 12, 12, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_3 (Conv2D)                    │ (None, 12, 12, 16)          │           4,624 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_3 (Activation)            │ (None, 12, 12, 16)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_2 (MaxPooling2D)       │ (None, 6, 6, 16)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_2 (Dropout)                  │ (None, 6, 6, 16)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ batch_normalization                  │ (None, 6, 6, 16)            │              64 │
│ (BatchNormalization)                 │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten (Flatten)                    │ (None, 576)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)                        │ (None, 512)                 │         295,424 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_4 (Activation)            │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_3 (Dropout)                  │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 4)                   │           2,052 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 330,516 (1.26 MB)
 Trainable params: 330,484 (1.26 MB)
 Non-trainable params: 32 (128.00 B)

Observations¶

The model has:

  1. The first convolutional layer of the CNN has 64(filters) x (3 x 3 x 1) + 64 parameters = 640. Padding is 'same' so the input and output size are matched. The swish layer applies an element-wise activation function to the input and has no learnable parameters.
  2. The input size is 48 x 48 x 1. We are fitting the gray scale image.
  3. The second Conv2D layer has 32 x (3 x 3 x 64 + 1) = 18464 parameters
  4. The batch normalization layer has 32 filters x 4 parameters = 128. The four parameters are Gamma (scale factor for each feature map), Beta (shift factor for each feature map). Beta and Gamma are trainable parameters. The other two parameters determined during training (but not trained) are moving mean and moving variable.
  5. The third Conv2D layer has 32 x (3 x 3 x 32 + 1) = 9248 parameters
  6. The Fourth Conv2D layer has 32 x (3 x 3 x 32 + 1) = 9248 parameters
  7. The batch normalization layer has 32 filters x 4 parameters = 128.
  8. The dense layer has 512 x 6 x 6 x 32 + 512 = 590, 336 parameters
  9. The classification layer has 4 x 512 + 4 = 2052 parameters

Evaluating the Model on the Test Set¶

In [70]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./cnn_model_3.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [71]:
#Fitting the model
cnn_model_3_history = cnn_model_3.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 25s 160ms/step - accuracy: 0.3240 - loss: 1.3510 - val_accuracy: 0.2300 - val_loss: 1.3504
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.4679 - loss: 1.1996 - val_accuracy: 0.3986 - val_loss: 1.2993
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.5105 - loss: 1.1277 - val_accuracy: 0.4663 - val_loss: 1.2315
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 113ms/step - accuracy: 0.5286 - loss: 1.0808 - val_accuracy: 0.5851 - val_loss: 1.0921
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5466 - loss: 1.0382 - val_accuracy: 0.6290 - val_loss: 0.9329
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5706 - loss: 0.9988 - val_accuracy: 0.6461 - val_loss: 0.9190
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5771 - loss: 0.9767 - val_accuracy: 0.6503 - val_loss: 0.8533
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.5985 - loss: 0.9404 - val_accuracy: 0.6406 - val_loss: 0.8535
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6051 - loss: 0.9358 - val_accuracy: 0.6640 - val_loss: 0.8114
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6134 - loss: 0.9150 - val_accuracy: 0.6481 - val_loss: 0.8584
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6282 - loss: 0.8923 - val_accuracy: 0.6209 - val_loss: 0.8992
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6325 - loss: 0.8685 - val_accuracy: 0.6676 - val_loss: 0.8087
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6350 - loss: 0.8727 - val_accuracy: 0.6664 - val_loss: 0.7947
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6501 - loss: 0.8574 - val_accuracy: 0.6802 - val_loss: 0.7796
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6537 - loss: 0.8326 - val_accuracy: 0.6831 - val_loss: 0.7868
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6587 - loss: 0.8268 - val_accuracy: 0.7007 - val_loss: 0.7694
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 116ms/step - accuracy: 0.6646 - loss: 0.8150 - val_accuracy: 0.7011 - val_loss: 0.7467
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6644 - loss: 0.8072 - val_accuracy: 0.6952 - val_loss: 0.7535
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 114ms/step - accuracy: 0.6647 - loss: 0.8163 - val_accuracy: 0.6831 - val_loss: 0.7917
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 115ms/step - accuracy: 0.6870 - loss: 0.7811 - val_accuracy: 0.7011 - val_loss: 0.7532

Observations and Insights:__

In [72]:
#Save training history
with open("cnn_model_3_training_history.json","w") as f:
  json.dump(cnn_model_3_history.history,f)

#Load training history
with open("cnn_model_3_training_history.json","r") as f:
  cnn_model_3_restored_history = json.load(f)

#save the trained model
cnn_model_3.save("cnn_model_3.keras")

cnn_model_3_restored = load_model("cnn_model_3.keras")
In [73]:
#plot training and validation accuracies and loss
dict_hist_3 = cnn_model_3_restored_history

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))

plt.plot(list_epoch, dict_hist['accuracy'], ls = '--', label = 'cnn_model_1_accuracy_grayscale')
plt.plot(list_epoch, dict_hist['val_accuracy'], ls = '--', label = 'cnn_model_1_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_2['accuracy'], label = 'cnn_model_2_accuracy_rgb')
plt.plot(list_epoch, dict_hist_2['val_accuracy'], label = 'cnn_model_2_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_3_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist['loss'], ls='-.', label='cnn_model_1_loss_grayscale')
plt.plot(list_epoch, dict_hist['val_loss'], ls='-.', label='cnn_model_1_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_2['loss'],  label='cnn_model_2_loss_rgb')
plt.plot(list_epoch, dict_hist_2['val_loss'],  label='cnn_model_2_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('cnn_model_3_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Observations and Insights:__

  1. The third convolutional neural network with one more layer (higher depth), batch normalization, and a silu activation function converges to the same accuracy and loss as the second model
  2. The training and validation trend for the third model with each epoch seems unstable compared to the smooth convergence of the first 2 CNN models
In [74]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_cnn_model_3 = cnn_model_3_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_cnn_model_3}")
4/4 - 1s - 324ms/step - accuracy: 0.7266 - loss: 0.6614
Model accuracy on the test batch:[0.6613636016845703, 0.7265625]

Observations and Insights:__

  1. The accuracy on test data is 72.7% which is in good agreement with the training and validation results of the third CNN model
In [75]:
pred_cnn_model_3 = cnn_model_3_restored.predict(test_images)
pred_cnn_model_3 = np.argmax(pred_cnn_model_3 , axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step  
In [76]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [78]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_cnn_model_3,'cnn_model_3')
              precision    recall  f1-score   support

           0       0.73      0.84      0.78        32
           1       0.69      0.56      0.62        32
           2       0.60      0.75      0.67        32
           3       0.96      0.75      0.84        32

    accuracy                           0.73       128
   macro avg       0.75      0.73      0.73       128
weighted avg       0.75      0.73      0.73       128

No description has been provided for this image

Observations and Insights:__

  1. The third model has lower accuracy 72.7% compared to the first model which had 75.8%.
  2. The F1-scores for the first model are better than the third CNN model
In [81]:
visualizeImages(cnn_model_3,1,'CNN_Model_3')
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 562ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
No description has been provided for this image

Think About It:¶

  • Did the models have a satisfactory performance? If not, then what are the possible reasons? The models struggle to classify sad and neutral faces correctly. This is because the facial features for these emotions closely resemble one another e.g. a closed mouth
  • Which Color mode showed better overall performance? The perfomance is matched for training on either rgb or grayscale What are the possible reasons? Do you think having 'rgb' color mode is needed because the images are already black and white? Grayscale image models should be used if possible because:
  1. The original images are grayscale - there is no rgb information
  2. Emotions are strongly influenced by lines and edges e.g a smile verses a suprise face. So color does not play a major role in determining emotions rather the facial features illustrated by lines, curves, edges contribute most.

Transfer Learning Architectures¶

In this section, we will create several Transfer Learning architectures. For the pre-trained models, we will select three popular architectures namely, VGG16, ResNet v2, and Efficient Net. The difference between these architectures and the previous architectures is that these will require 3 input channels while the earlier ones worked on 'grayscale' images. Therefore, we need to create new DataLoaders.

Creating our Data Loaders for Transfer Learning Architectures¶

In this section, we are creating data loaders that we will use as inputs to our Neural Network. We will have to go with color_mode = 'rgb' as this is the required format for the transfer learning architectures.

In [82]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [83]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="rgb",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.

VGG16 Model¶

VGG16 is a pretrained convolutional neural network that is widely used for image classification and feature extraction.

Importing the VGG16 Architecture¶

In [84]:
#Import vgg16 architecture
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras import Model

vgg_model = VGG16(include_top = False, weights = 'imagenet', input_shape = (48, 48, 3))
vgg_model.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
58889256/58889256 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Model: "vgg16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)             │ (None, 48, 48, 3)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_conv1 (Conv2D)                │ (None, 48, 48, 64)          │           1,792 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_conv2 (Conv2D)                │ (None, 48, 48, 64)          │          36,928 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_pool (MaxPooling2D)           │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_conv1 (Conv2D)                │ (None, 24, 24, 128)         │          73,856 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_conv2 (Conv2D)                │ (None, 24, 24, 128)         │         147,584 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_pool (MaxPooling2D)           │ (None, 12, 12, 128)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv1 (Conv2D)                │ (None, 12, 12, 256)         │         295,168 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv2 (Conv2D)                │ (None, 12, 12, 256)         │         590,080 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv3 (Conv2D)                │ (None, 12, 12, 256)         │         590,080 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_pool (MaxPooling2D)           │ (None, 6, 6, 256)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv1 (Conv2D)                │ (None, 6, 6, 512)           │       1,180,160 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv2 (Conv2D)                │ (None, 6, 6, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv3 (Conv2D)                │ (None, 6, 6, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_pool (MaxPooling2D)           │ (None, 3, 3, 512)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv1 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv2 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv3 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_pool (MaxPooling2D)           │ (None, 1, 1, 512)           │               0 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 14,714,688 (56.13 MB)
 Trainable params: 14,714,688 (56.13 MB)
 Non-trainable params: 0 (0.00 B)

Observations and Insights:__

  1. The VGG16 model has 14, 714, 688 trainable parameters
  2. We import the first 5 blocks of the pre-trained model and we will add a fully connected classification portion to it.

The model architecture is:

  1. Input layer 48 x 48 x 3 (rgb images)
  2. First convolution layer (64 x 3 x 3 x 3) + 64 = 1792 parameters. This layer has 64 filters with a 3 x 3 kernel.
  3. Second convolution layer (64 x 3 x 3 x 64) + 64 = 36928 parameters. This layer has 64 filters with a 3 x 3 kernel.
  4. Max pooling layer with size 2 x 2
  5. Third convolutiononal layer (128 x 3 x 3 x 64) + 128 = 73856 parameters. This layer has 128 filters with a 3 x 3 kernel.
  6. Fourth convolutional layer (128 x 3 x 3 x 128) + 128 = 147584 parameters. This layer has 128 filters with a 3 x 3 kernel.
  7. Max pooling layer with size 2 x 2
  8. Fifth convolutional layer (256 x 3 x 3 x 128) + 256 = 295168 parameters. This layer has 256 filters with a 3 x 3 kernel.
  9. Sixth convolutional layer (256 x 3 x 3 x 256) + 256 = 590,080 parameters. This layer has 256 filters with a 3 x 3 kernel.
  10. Seventh convolutional layer (256 x 3 x 3 x 256) + 256 = 590,080 parameters. This layer has 256 filters with a 3 x 3 kernel.
  11. Max pooling layer with size 2 x 2
  12. Eigth convolutional layer (512 x 3 x 3 x 256)+512 = 1180160 parameters. This layer has 512 filters with a 3 x 3 kernel.
  13. Ninth convolutional layer (512 x 3 x 3 x 512) + 512 = 2359808 parameters. This layer has 512 filters with a 3 x 3 kernel.
  14. Tenth convolutional layer (512 x 3 x 3 x 512) + 512 = 2359808 parameters. This layer has 512 filters with a 3 x 3 kernel.
  15. Max pooling layer with size 2 x 2
  16. Eleventh convolutional layer (512 x 3 x 3 x 512) + 512 = 2359808 parameters. This layer has 512 filters with a 3 x 3 kernel.
  17. Twelfth convolutional layer (512 x 3 x 3 x 512) + 512 = 2359808 parameters. This layer has 512 filters with a 3 x 3 kernel.
  18. Thirteenth convolutional layer (512 x 3 x 3 x 512) + 512 = 2359808 parameters. This layer has 512 filters with a 3 x 3 kernel.
  19. Max pooling layer with size 3 x 3

Model Building¶

  • Import VGG16 upto the layer of your choice and add Fully Connected layers on top of it.
In [85]:
transfer_layer = vgg_model.get_layer('block5_pool')

vgg_model.trainable = False

#Add classification layer
x = Flatten()(transfer_layer.output)

x = Dense(256, activation = 'relu')(x)

x = Dense(128, activation = 'relu')(x)

x = Dropout(0.3)(x)

x = Dense(64, activation = 'relu')(x)

x = BatchNormalization()(x)

vgg16_pred = Dense(4, activation = 'softmax')(x)

#Initialize the model
vgg_model_4 = Model(vgg_model.input, vgg16_pred)

Compiling and Training the VGG16 Model¶

In [86]:
#Compiling the model
vgg_model_4.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [87]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./vgg_model_4.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [88]:
#Fitting the model
vgg_model_4_history = vgg_model_4.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 41s 280ms/step - accuracy: 0.2989 - loss: 1.5841 - val_accuracy: 0.4319 - val_loss: 1.2576
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.3918 - loss: 1.2941 - val_accuracy: 0.4752 - val_loss: 1.1959
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4395 - loss: 1.2257 - val_accuracy: 0.5197 - val_loss: 1.1144
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4528 - loss: 1.2089 - val_accuracy: 0.5221 - val_loss: 1.0958
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.4555 - loss: 1.1923 - val_accuracy: 0.5335 - val_loss: 1.0819
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.4684 - loss: 1.1768 - val_accuracy: 0.5356 - val_loss: 1.0676
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4705 - loss: 1.1685 - val_accuracy: 0.5439 - val_loss: 1.0705
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4779 - loss: 1.1520 - val_accuracy: 0.5437 - val_loss: 1.0712
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4796 - loss: 1.1478 - val_accuracy: 0.5451 - val_loss: 1.0561
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4874 - loss: 1.1366 - val_accuracy: 0.5390 - val_loss: 1.0651
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4870 - loss: 1.1373 - val_accuracy: 0.5555 - val_loss: 1.0545
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4961 - loss: 1.1215 - val_accuracy: 0.5433 - val_loss: 1.0663
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.4988 - loss: 1.1269 - val_accuracy: 0.5465 - val_loss: 1.0495
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4928 - loss: 1.1269 - val_accuracy: 0.5421 - val_loss: 1.0513
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5023 - loss: 1.1126 - val_accuracy: 0.5510 - val_loss: 1.0554
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.4993 - loss: 1.1141 - val_accuracy: 0.5522 - val_loss: 1.0371
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5112 - loss: 1.1100 - val_accuracy: 0.5228 - val_loss: 1.0938
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.5092 - loss: 1.1083 - val_accuracy: 0.5416 - val_loss: 1.0598
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5159 - loss: 1.0949 - val_accuracy: 0.5414 - val_loss: 1.0550
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5178 - loss: 1.0839 - val_accuracy: 0.5384 - val_loss: 1.0596
In [89]:
#Save training history
with open("vgg_model_4_training_history.json","w") as f:
  json.dump(vgg_model_4_history.history,f)

#Load training history
with open("vgg_model_4_training_history.json","r") as f:
  vgg_model_4_restored_history = json.load(f)

#save the trained model
vgg_model_4.save("vgg_model_4.keras")

vgg_model_4_restored = load_model("vgg_model_4.keras")

Evaluating the VGG16 model¶

In [90]:
#plot training and validation accuracies and loss
dict_hist_4 = vgg_model_4_restored_history

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))

plt.plot(list_epoch, dict_hist['accuracy'], ls = '--', label = 'cnn_model_1_accuracy_grayscale')
plt.plot(list_epoch, dict_hist['val_accuracy'], ls = '--', label = 'cnn_model_1_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_2['accuracy'], label = 'cnn_model_2_accuracy_rgb')
plt.plot(list_epoch, dict_hist_2['val_accuracy'], label = 'cnn_model_2_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_4['accuracy'],  label = 'vgg_model_4_accuracy_rgb')
plt.plot(list_epoch, dict_hist_4['val_accuracy'],  label = 'vgg_model_4_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('vgg_model_4_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist['loss'], ls='-.', label='cnn_model_1_loss_grayscale')
plt.plot(list_epoch, dict_hist['val_loss'], ls='-.', label='cnn_model_1_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_2['loss'],  label='cnn_model_2_loss_rgb')
plt.plot(list_epoch, dict_hist_2['val_loss'],  label='cnn_model_2_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_4['loss'],  label='vgg_model_4_loss_rgb')
plt.plot(list_epoch, dict_hist_4['val_loss'],  label='vgg_model_4_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('vgg_model_4_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Think About It: - Observations and Insights:__

  • What do you infer from the general trend in the training performance? **Importing VGG16 pre-trained and adding a classification layer, does not yield a model with good accuracy compared to the training CNN models developed so far. ***
  • Is the training accuracy consistently improving? ***The training accuracy improves at the early epochs but plateaus at 50% for both training and validation accuracy while other CNN models attained accuracies above 60%. ***
  • Is the validation accuracy also improving similarly? ***The validation accuracy improves at the early epochs but also plateaus at 50% while other CNN models attained accuracies above 60%. ***

Note: You can even go back and build your own architecture on top of the VGG16 Transfer layer and see if you can improve the performance

In [91]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [92]:
#Import vgg16 architecture
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras import Model

vgg_model_5 = VGG16(include_top = False, weights = 'imagenet', input_shape = (48, 48, 3))
vgg_model_5.summary()
Model: "vgg16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)             │ (None, 48, 48, 3)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_conv1 (Conv2D)                │ (None, 48, 48, 64)          │           1,792 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_conv2 (Conv2D)                │ (None, 48, 48, 64)          │          36,928 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block1_pool (MaxPooling2D)           │ (None, 24, 24, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_conv1 (Conv2D)                │ (None, 24, 24, 128)         │          73,856 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_conv2 (Conv2D)                │ (None, 24, 24, 128)         │         147,584 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block2_pool (MaxPooling2D)           │ (None, 12, 12, 128)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv1 (Conv2D)                │ (None, 12, 12, 256)         │         295,168 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv2 (Conv2D)                │ (None, 12, 12, 256)         │         590,080 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_conv3 (Conv2D)                │ (None, 12, 12, 256)         │         590,080 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block3_pool (MaxPooling2D)           │ (None, 6, 6, 256)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv1 (Conv2D)                │ (None, 6, 6, 512)           │       1,180,160 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv2 (Conv2D)                │ (None, 6, 6, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_conv3 (Conv2D)                │ (None, 6, 6, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block4_pool (MaxPooling2D)           │ (None, 3, 3, 512)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv1 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv2 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_conv3 (Conv2D)                │ (None, 3, 3, 512)           │       2,359,808 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ block5_pool (MaxPooling2D)           │ (None, 1, 1, 512)           │               0 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 14,714,688 (56.13 MB)
 Trainable params: 14,714,688 (56.13 MB)
 Non-trainable params: 0 (0.00 B)
In [93]:
transfer_layer_5 = vgg_model_5.get_layer('block5_pool')

for layer in vgg_model_5.layers[:-4]:#Freeze all layers except the last 4
  layer.trainable = False

#Add classification layer
x_model_5 = Flatten()(transfer_layer_5.output)

x_model_5 = Dense(256, activation = 'relu')(x_model_5)

x_model_5 = Dense(128, activation = 'relu')(x_model_5)

x_model_5 = Dropout(0.3)(x_model_5)

x_model_5 = Dense(64, activation = 'relu')(x_model_5)

x_model_5 = BatchNormalization()(x_model_5)

vgg16_pred_model_5 = Dense(4, activation = 'softmax')(x_model_5)

#Initialize the model
vgg_model_5 = Model(vgg_model_5.input, vgg16_pred_model_5)
In [94]:
#Compiling the model
vgg_model_5.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [95]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./vgg_model_5.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [96]:
#Fitting the model
vgg_model_5_history = vgg_model_5.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 31s 214ms/step - accuracy: 0.3204 - loss: 1.5930 - val_accuracy: 0.5049 - val_loss: 1.2176
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.4715 - loss: 1.1805 - val_accuracy: 0.4754 - val_loss: 1.2551
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5543 - loss: 1.0324 - val_accuracy: 0.5740 - val_loss: 0.9679
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5669 - loss: 1.0051 - val_accuracy: 0.6028 - val_loss: 0.9440
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.5869 - loss: 0.9649 - val_accuracy: 0.6499 - val_loss: 0.8805
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6117 - loss: 0.9115 - val_accuracy: 0.6660 - val_loss: 0.7990
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.6226 - loss: 0.8935 - val_accuracy: 0.5933 - val_loss: 0.9880
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6459 - loss: 0.8539 - val_accuracy: 0.6786 - val_loss: 0.7964
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6487 - loss: 0.8470 - val_accuracy: 0.6784 - val_loss: 0.8127
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6589 - loss: 0.8161 - val_accuracy: 0.6853 - val_loss: 0.7791
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6547 - loss: 0.8224 - val_accuracy: 0.6518 - val_loss: 0.8456
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.6751 - loss: 0.7892 - val_accuracy: 0.6530 - val_loss: 0.8844
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.6908 - loss: 0.7509 - val_accuracy: 0.6869 - val_loss: 0.8090
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 173ms/step - accuracy: 0.6871 - loss: 0.7695 - val_accuracy: 0.6898 - val_loss: 0.8002
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.6966 - loss: 0.7422 - val_accuracy: 0.6902 - val_loss: 0.7719
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.7081 - loss: 0.7218 - val_accuracy: 0.6737 - val_loss: 0.8029
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.7098 - loss: 0.7167 - val_accuracy: 0.6377 - val_loss: 0.9624
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.7026 - loss: 0.7175 - val_accuracy: 0.6824 - val_loss: 0.8155
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 174ms/step - accuracy: 0.7189 - loss: 0.6878 - val_accuracy: 0.6883 - val_loss: 0.8391
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.7144 - loss: 0.6900 - val_accuracy: 0.6849 - val_loss: 0.8637
In [97]:
#Save training history
with open("vgg_model_5_training_history.json","w") as f:
  json.dump(vgg_model_5_history.history,f)

#Load training history
with open("vgg_model_5_training_history.json","r") as f:
  vgg_model_5_restored_history = json.load(f)

#save the trained model
vgg_model_5.save("vgg_model_5.keras")

vgg_model_5_restored = load_model("vgg_model_5.keras")
In [98]:
#plot training and validation accuracies and loss
dict_hist_5 = vgg_model_5_restored_history

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '-.', label = 'cnn_model_3_accuracy_rgb')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '-.', label = 'cnn_model_3_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_4['accuracy'], ls = '--', label = 'vgg_model_4_accuracy_rgb')
plt.plot(list_epoch, dict_hist_4['val_accuracy'], ls = '--', label = 'vgg_model_4_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['accuracy'],  label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'],  label = 'vgg_model_5_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('vgg_model_5_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))

plt.plot(list_epoch, dict_hist_3['loss'],  ls = '-.', label='cnn_model_3_loss_rgb')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls = '-.', label='cnn_model_3_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_4['loss'], ls = '--', label='vgg_model_4_loss_rgb')
plt.plot(list_epoch, dict_hist_4['val_loss'], ls = '--', label='vgg_model_4_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_5['loss'],  label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'],  label='vgg_model_5_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('vgg_model_5_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Observations and Insights:__

  1. Allowing the last few layers of the VGG16 model to train on our dataset of faces improves model performance significantly
  2. The latest VGG16 model (model 5) matches the > 60% accuracy on training and validation data sets
  3. We see that the latest VGG16 model (model 5) is overfitting on the training data. For the last 10 epochs that accuracy on the training data is higher than the validation dataset showing that the model is not generalizing well to unseen datasets.
In [99]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_vgg_model_5 = vgg_model_5_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_vgg_model_5}")
4/4 - 4s - 885ms/step - accuracy: 0.7344 - loss: 0.7386
Model accuracy on the test batch:[0.7386221289634705, 0.734375]

Observations and Insights:__

  1. The accuracy on test data is 73.4% which is in good agreement with the training and validation results
In [100]:
pred_vgg_model_5 = vgg_model_5_restored.predict(test_images)
pred_vgg_model_5 = np.argmax(pred_vgg_model_5 , axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step  
In [101]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [102]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_vgg_model_5,'vgg_model_5')
              precision    recall  f1-score   support

           0       0.76      0.81      0.79        32
           1       0.71      0.62      0.67        32
           2       0.56      0.72      0.63        32
           3       1.00      0.78      0.88        32

    accuracy                           0.73       128
   macro avg       0.76      0.73      0.74       128
weighted avg       0.76      0.73      0.74       128

No description has been provided for this image

Observations and Insights:__

  1. The fifth model an of accuracy 73%.
  2. Sad and neutral faces are classified incorrectly more often. Actual sad faces are classified as neutral and actual neutral faces are detected as sad.
  3. Happy and surprise faces are classified correctly more often
In [103]:
visualizeImages(vgg_model_5_restored,3,'vgg_model_5')
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 1s/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
No description has been provided for this image

ResNet V2 Model¶

ResNet V2 (Residual Network Version 2) is an enhanced version of the original ResNet architecture, a deep convolutional neural netwrork designed to solve the vanishing gradient problem improving training on deep networks. ResNet V2 incorporates residual connections and introduces Batch Normalization before the activation layer for better convergence.

In [104]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)

This model will use RGB images which were loaded before training the VGG16 model.

In [105]:
import tensorflow as tf
import tensorflow.keras.applications as ap
from tensorflow.keras import Model

Resnet_model_6 = ap.ResNet101(include_top = False, weights = "imagenet", input_shape=(48,48,3))
Resnet_model_6.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet101_weights_tf_dim_ordering_tf_kernels_notop.h5
171446536/171446536 ━━━━━━━━━━━━━━━━━━━━ 1s 0us/step
Model: "resnet101"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)              ┃ Output Shape           ┃        Param # ┃ Connected to           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)  │ (None, 48, 48, 3)      │              0 │ -                      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_pad (ZeroPadding2D) │ (None, 54, 54, 3)      │              0 │ input_layer[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_conv (Conv2D)       │ (None, 24, 24, 64)     │          9,472 │ conv1_pad[0][0]        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_bn                  │ (None, 24, 24, 64)     │            256 │ conv1_conv[0][0]       │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_relu (Activation)   │ (None, 24, 24, 64)     │              0 │ conv1_bn[0][0]         │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ pool1_pad (ZeroPadding2D) │ (None, 26, 26, 64)     │              0 │ conv1_relu[0][0]       │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ pool1_pool (MaxPooling2D) │ (None, 12, 12, 64)     │              0 │ pool1_pad[0][0]        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_conv       │ (None, 12, 12, 64)     │          4,160 │ pool1_pool[0][0]       │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_0_conv       │ (None, 12, 12, 256)    │         16,640 │ pool1_pool[0][0]       │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_0_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block1_0_bn[0][… │
│                           │                        │                │ conv2_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_out          │ (None, 12, 12, 256)    │              0 │ conv2_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_conv       │ (None, 12, 12, 64)     │         16,448 │ conv2_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block1_out[0][0… │
│                           │                        │                │ conv2_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_out          │ (None, 12, 12, 256)    │              0 │ conv2_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_conv       │ (None, 12, 12, 64)     │         16,448 │ conv2_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block2_out[0][0… │
│                           │                        │                │ conv2_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_out          │ (None, 12, 12, 256)    │              0 │ conv2_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_conv       │ (None, 6, 6, 128)      │         32,896 │ conv2_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_0_conv       │ (None, 6, 6, 512)      │        131,584 │ conv2_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_0_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block1_0_bn[0][… │
│                           │                        │                │ conv3_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_out          │ (None, 6, 6, 512)      │              0 │ conv3_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block1_out[0][0… │
│                           │                        │                │ conv3_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_out          │ (None, 6, 6, 512)      │              0 │ conv3_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block2_out[0][0… │
│                           │                        │                │ conv3_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_out          │ (None, 6, 6, 512)      │              0 │ conv3_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block4_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block4_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block4_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block4_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block4_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block4_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block4_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block3_out[0][0… │
│                           │                        │                │ conv3_block4_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_out          │ (None, 6, 6, 512)      │              0 │ conv3_block4_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_conv       │ (None, 3, 3, 256)      │        131,328 │ conv3_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_0_conv       │ (None, 3, 3, 1024)     │        525,312 │ conv3_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_0_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block1_0_bn[0][… │
│                           │                        │                │ conv4_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block1_out[0][0… │
│                           │                        │                │ conv4_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block2_out[0][0… │
│                           │                        │                │ conv4_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block4_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block4_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block4_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block4_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block4_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block4_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block4_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block3_out[0][0… │
│                           │                        │                │ conv4_block4_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block4_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block5_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block5_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block5_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block5_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block5_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block5_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block5_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block4_out[0][0… │
│                           │                        │                │ conv4_block5_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block5_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block5_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block6_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block6_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block6_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block6_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block6_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block6_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block6_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block5_out[0][0… │
│                           │                        │                │ conv4_block6_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block6_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block6_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block7_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block7_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block7_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block7_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block7_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block7_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block7_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block6_out[0][0… │
│                           │                        │                │ conv4_block7_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block7_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block7_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block8_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block8_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block8_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block8_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block8_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block8_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block8_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block7_out[0][0… │
│                           │                        │                │ conv4_block8_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block8_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block8_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block9_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block9_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block9_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block9_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block9_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block9_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block9_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block8_out[0][0… │
│                           │                        │                │ conv4_block9_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block9_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block9_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block10_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block10_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block10_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block10_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block10_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block10_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block10_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block9_out[0][0… │
│                           │                        │                │ conv4_block10_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block10_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block10_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block11_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block11_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block11_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block11_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block11_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block11_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block11_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block10_out[0][… │
│                           │                        │                │ conv4_block11_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block11_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block11_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block12_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block12_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block12_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block12_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block12_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block12_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block12_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block11_out[0][… │
│                           │                        │                │ conv4_block12_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block12_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block12_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block13_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block13_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block13_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block13_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block13_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block13_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block13_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block12_out[0][… │
│                           │                        │                │ conv4_block13_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block13_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block13_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block14_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block14_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block14_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block14_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block14_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block14_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block14_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block13_out[0][… │
│                           │                        │                │ conv4_block14_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block14_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block14_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block15_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block15_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block15_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block15_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block15_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block15_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block15_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block14_out[0][… │
│                           │                        │                │ conv4_block15_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block15_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block15_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block16_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block16_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block16_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block16_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block16_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block16_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block16_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block15_out[0][… │
│                           │                        │                │ conv4_block16_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block16_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block16_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block17_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block17_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block17_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block17_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block17_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block17_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block17_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block16_out[0][… │
│                           │                        │                │ conv4_block17_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block17_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block17_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block18_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block18_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block18_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block18_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block18_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block18_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block18_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block17_out[0][… │
│                           │                        │                │ conv4_block18_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block18_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block18_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block19_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block19_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block19_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block19_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block19_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block19_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block19_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block18_out[0][… │
│                           │                        │                │ conv4_block19_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block19_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block19_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block20_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block20_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block20_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block20_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block20_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block20_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block20_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block19_out[0][… │
│                           │                        │                │ conv4_block20_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block20_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block20_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block21_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block21_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block21_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block21_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block21_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block21_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block21_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block20_out[0][… │
│                           │                        │                │ conv4_block21_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block21_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block21_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block22_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block22_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block22_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block22_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block22_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block22_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block22_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block21_out[0][… │
│                           │                        │                │ conv4_block22_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block22_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block22_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block23_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block23_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block23_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block23_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block23_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block23_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block23_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block22_out[0][… │
│                           │                        │                │ conv4_block23_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block23_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_conv       │ (None, 2, 2, 512)      │        524,800 │ conv4_block23_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_0_conv       │ (None, 2, 2, 2048)     │      2,099,200 │ conv4_block23_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_0_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block1_0_bn[0][… │
│                           │                        │                │ conv5_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_conv       │ (None, 2, 2, 512)      │      1,049,088 │ conv5_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block1_out[0][0… │
│                           │                        │                │ conv5_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_conv       │ (None, 2, 2, 512)      │      1,049,088 │ conv5_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block2_out[0][0… │
│                           │                        │                │ conv5_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
 Total params: 42,658,176 (162.73 MB)
 Trainable params: 42,552,832 (162.33 MB)
 Non-trainable params: 105,344 (411.50 KB)
In [106]:
from tensorflow.keras.utils import plot_model
from IPython.display import Image

plot_model(Resnet_model_6, to_file="Resnet_model_plot.png", show_shapes = True, show_layer_names=True)
Image(filename="Resnet_model_plot.png")
Output hidden; open in https://colab.research.google.com to view.

Model Building¶

  • Import Resnet v2 upto the layer of your choice and add Fully Connected layers on top of it.
  • We will import until conv5_block3_add layer of the Resnet model.
In [107]:
transfer_layer_Resnet = Resnet_model_6.get_layer('conv5_block3_add')
Resnet_model_6.trainable = False

#Add classification layer
x_model_6 = Flatten()(transfer_layer_Resnet.output)

x_model_6 = Dense(256, activation = 'relu')(x_model_6)

x_model_6 = Dense(128, activation = 'relu')(x_model_6)

x_model_6 = Dropout(0.3)(x_model_6)

x_model_6 = Dense(64, activation = 'relu')(x_model_6)

x_model_6 = BatchNormalization()(x_model_6)

Resnet_pred_model_6 = Dense(4, activation = 'softmax')(x_model_6)

#initialize the model
Resnet_model_6 = Model(Resnet_model_6.input, Resnet_pred_model_6)

Compiling and Training the Model¶

In [108]:
#Compiling the model
Resnet_model_6.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [109]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./Resnet_model_6.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [110]:
#Fitting the model
Resnet_model_6_history = Resnet_model_6.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 56s 319ms/step - accuracy: 0.2528 - loss: 1.6185 - val_accuracy: 0.2456 - val_loss: 1.4073
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 180ms/step - accuracy: 0.2718 - loss: 1.4265 - val_accuracy: 0.3698 - val_loss: 1.3448
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2755 - loss: 1.4003 - val_accuracy: 0.3698 - val_loss: 1.3450
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2764 - loss: 1.3911 - val_accuracy: 0.3698 - val_loss: 1.3431
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2735 - loss: 1.3881 - val_accuracy: 0.3698 - val_loss: 1.3445
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2737 - loss: 1.3873 - val_accuracy: 0.3698 - val_loss: 1.3394
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2822 - loss: 1.3853 - val_accuracy: 0.3698 - val_loss: 1.3450
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2693 - loss: 1.3864 - val_accuracy: 0.3698 - val_loss: 1.3420
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2810 - loss: 1.3818 - val_accuracy: 0.3698 - val_loss: 1.3389
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2656 - loss: 1.3853 - val_accuracy: 0.3698 - val_loss: 1.3510
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2769 - loss: 1.3840 - val_accuracy: 0.3698 - val_loss: 1.3429
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2666 - loss: 1.3841 - val_accuracy: 0.3698 - val_loss: 1.3430
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 180ms/step - accuracy: 0.2779 - loss: 1.3783 - val_accuracy: 0.3698 - val_loss: 1.3372
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2746 - loss: 1.3775 - val_accuracy: 0.3698 - val_loss: 1.3380
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2772 - loss: 1.3799 - val_accuracy: 0.3698 - val_loss: 1.3362
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2817 - loss: 1.3770 - val_accuracy: 0.3698 - val_loss: 1.3378
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2786 - loss: 1.3733 - val_accuracy: 0.3706 - val_loss: 1.3338
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2819 - loss: 1.3699 - val_accuracy: 0.3698 - val_loss: 1.3410
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2935 - loss: 1.3707 - val_accuracy: 0.3698 - val_loss: 1.3411
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2820 - loss: 1.3732 - val_accuracy: 0.3803 - val_loss: 1.3224

Evaluating the ResNet Model¶

In [111]:
#Save training history
with open("Resnet_model_6_training_history.json","w") as f:
  json.dump(Resnet_model_6_history.history,f)

#Load training history
with open("Resnet_model_6_training_history.json","r") as f:
  Resnet_model_6_history_restored = json.load(f)

#save the trained model
Resnet_model_6.save("Resnet_model_6.keras")

Resnet_model_6_restored = load_model("Resnet_model_6.keras")
In [112]:
#plot training and validation accuracies and loss
dict_hist_6 = Resnet_model_6_history_restored

list_epoch = [i for i in range(1,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  ls = '-.',label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '-.', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_6['accuracy'],  label = 'Resnet_model_6_accuracy_rgb')
plt.plot(list_epoch, dict_hist_6['val_accuracy'],  label = 'Resnet_model_6_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('resnet_model_6_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))

plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'],ls = '-.',  label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_6['loss'],  label='Resnet_model_6_loss_rgb')
plt.plot(list_epoch, dict_hist_6['val_loss'],  label='Resnet_model_6_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('resnet_model_6_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Observations and Insights:__

  1. Unfortunately importing Resnet V2 pre-trained model from the 'conv5_block3_add' layer and adding a classification layer does not yield good results. The model does not learn the features of the images after 20 epochs with the training and validation accuracy remaining at 20%.
  2. There is no improvement in accuracy or validation loss from one epoch to another.
  3. We need to improve the ability of the model to learn from the training images.
  4. We will attempt allowing several layers of the pre-trained model to learn new weights from the training images and see if this improves model ability to predict facial emotions.

Note: You can even go back and build your own architecture on top of the ResNet Transfer layer and see if you can improve the performance.

In [113]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [114]:
import tensorflow as tf
import tensorflow.keras.applications as ap
from tensorflow.keras import Model

Resnet_model_7 = ap.ResNet101(include_top = False, weights = "imagenet", input_shape=(48,48,3))
Resnet_model_7.summary()
Model: "resnet101"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)              ┃ Output Shape           ┃        Param # ┃ Connected to           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)  │ (None, 48, 48, 3)      │              0 │ -                      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_pad (ZeroPadding2D) │ (None, 54, 54, 3)      │              0 │ input_layer[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_conv (Conv2D)       │ (None, 24, 24, 64)     │          9,472 │ conv1_pad[0][0]        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_bn                  │ (None, 24, 24, 64)     │            256 │ conv1_conv[0][0]       │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1_relu (Activation)   │ (None, 24, 24, 64)     │              0 │ conv1_bn[0][0]         │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ pool1_pad (ZeroPadding2D) │ (None, 26, 26, 64)     │              0 │ conv1_relu[0][0]       │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ pool1_pool (MaxPooling2D) │ (None, 12, 12, 64)     │              0 │ pool1_pad[0][0]        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_conv       │ (None, 12, 12, 64)     │          4,160 │ pool1_pool[0][0]       │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_0_conv       │ (None, 12, 12, 256)    │         16,640 │ pool1_pool[0][0]       │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_0_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block1_0_bn[0][… │
│                           │                        │                │ conv2_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block1_out          │ (None, 12, 12, 256)    │              0 │ conv2_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_conv       │ (None, 12, 12, 64)     │         16,448 │ conv2_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block1_out[0][0… │
│                           │                        │                │ conv2_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block2_out          │ (None, 12, 12, 256)    │              0 │ conv2_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_conv       │ (None, 12, 12, 64)     │         16,448 │ conv2_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_1_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_conv       │ (None, 12, 12, 64)     │         36,928 │ conv2_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_bn         │ (None, 12, 12, 64)     │            256 │ conv2_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_2_relu       │ (None, 12, 12, 64)     │              0 │ conv2_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_3_conv       │ (None, 12, 12, 256)    │         16,640 │ conv2_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_3_bn         │ (None, 12, 12, 256)    │          1,024 │ conv2_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_add (Add)    │ (None, 12, 12, 256)    │              0 │ conv2_block2_out[0][0… │
│                           │                        │                │ conv2_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv2_block3_out          │ (None, 12, 12, 256)    │              0 │ conv2_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_conv       │ (None, 6, 6, 128)      │         32,896 │ conv2_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_0_conv       │ (None, 6, 6, 512)      │        131,584 │ conv2_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_0_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block1_0_bn[0][… │
│                           │                        │                │ conv3_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block1_out          │ (None, 6, 6, 512)      │              0 │ conv3_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block1_out[0][0… │
│                           │                        │                │ conv3_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block2_out          │ (None, 6, 6, 512)      │              0 │ conv3_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block2_out[0][0… │
│                           │                        │                │ conv3_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block3_out          │ (None, 6, 6, 512)      │              0 │ conv3_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_conv       │ (None, 6, 6, 128)      │         65,664 │ conv3_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block4_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_1_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block4_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_conv       │ (None, 6, 6, 128)      │        147,584 │ conv3_block4_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_bn         │ (None, 6, 6, 128)      │            512 │ conv3_block4_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_2_relu       │ (None, 6, 6, 128)      │              0 │ conv3_block4_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_3_conv       │ (None, 6, 6, 512)      │         66,048 │ conv3_block4_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_3_bn         │ (None, 6, 6, 512)      │          2,048 │ conv3_block4_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_add (Add)    │ (None, 6, 6, 512)      │              0 │ conv3_block3_out[0][0… │
│                           │                        │                │ conv3_block4_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv3_block4_out          │ (None, 6, 6, 512)      │              0 │ conv3_block4_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_conv       │ (None, 3, 3, 256)      │        131,328 │ conv3_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_0_conv       │ (None, 3, 3, 1024)     │        525,312 │ conv3_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_0_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block1_0_bn[0][… │
│                           │                        │                │ conv4_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block1_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block1_out[0][0… │
│                           │                        │                │ conv4_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block2_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block2_out[0][0… │
│                           │                        │                │ conv4_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block3_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block3_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block4_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block4_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block4_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block4_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block4_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block4_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block4_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block3_out[0][0… │
│                           │                        │                │ conv4_block4_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block4_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block4_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block4_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block5_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block5_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block5_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block5_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block5_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block5_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block5_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block4_out[0][0… │
│                           │                        │                │ conv4_block5_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block5_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block5_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block5_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block6_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block6_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block6_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block6_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block6_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block6_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block6_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block5_out[0][0… │
│                           │                        │                │ conv4_block6_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block6_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block6_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block6_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block7_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block7_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block7_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block7_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block7_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block7_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block7_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block6_out[0][0… │
│                           │                        │                │ conv4_block7_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block7_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block7_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block7_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block8_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block8_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block8_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block8_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block8_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block8_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block8_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block7_out[0][0… │
│                           │                        │                │ conv4_block8_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block8_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block8_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_conv       │ (None, 3, 3, 256)      │        262,400 │ conv4_block8_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block9_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_1_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block9_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_conv       │ (None, 3, 3, 256)      │        590,080 │ conv4_block9_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_bn         │ (None, 3, 3, 256)      │          1,024 │ conv4_block9_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_2_relu       │ (None, 3, 3, 256)      │              0 │ conv4_block9_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_3_conv       │ (None, 3, 3, 1024)     │        263,168 │ conv4_block9_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_3_bn         │ (None, 3, 3, 1024)     │          4,096 │ conv4_block9_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_add (Add)    │ (None, 3, 3, 1024)     │              0 │ conv4_block8_out[0][0… │
│                           │                        │                │ conv4_block9_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block9_out          │ (None, 3, 3, 1024)     │              0 │ conv4_block9_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block9_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block10_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block10_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block10_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block10_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block10_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block10_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block10_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block9_out[0][0… │
│                           │                        │                │ conv4_block10_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block10_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block10_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block10_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block11_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block11_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block11_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block11_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block11_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block11_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block11_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block10_out[0][… │
│                           │                        │                │ conv4_block11_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block11_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block11_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block11_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block12_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block12_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block12_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block12_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block12_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block12_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block12_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block11_out[0][… │
│                           │                        │                │ conv4_block12_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block12_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block12_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block12_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block13_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block13_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block13_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block13_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block13_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block13_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block13_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block12_out[0][… │
│                           │                        │                │ conv4_block13_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block13_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block13_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block13_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block14_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block14_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block14_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block14_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block14_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block14_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block14_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block13_out[0][… │
│                           │                        │                │ conv4_block14_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block14_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block14_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block14_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block15_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block15_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block15_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block15_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block15_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block15_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block15_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block14_out[0][… │
│                           │                        │                │ conv4_block15_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block15_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block15_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block15_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block16_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block16_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block16_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block16_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block16_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block16_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block16_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block15_out[0][… │
│                           │                        │                │ conv4_block16_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block16_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block16_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block16_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block17_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block17_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block17_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block17_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block17_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block17_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block17_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block16_out[0][… │
│                           │                        │                │ conv4_block17_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block17_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block17_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block17_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block18_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block18_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block18_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block18_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block18_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block18_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block18_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block17_out[0][… │
│                           │                        │                │ conv4_block18_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block18_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block18_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block18_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block19_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block19_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block19_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block19_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block19_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block19_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block19_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block18_out[0][… │
│                           │                        │                │ conv4_block19_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block19_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block19_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block19_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block20_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block20_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block20_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block20_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block20_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block20_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block20_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block19_out[0][… │
│                           │                        │                │ conv4_block20_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block20_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block20_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block20_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block21_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block21_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block21_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block21_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block21_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block21_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block21_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block20_out[0][… │
│                           │                        │                │ conv4_block21_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block21_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block21_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block21_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block22_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block22_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block22_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block22_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block22_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block22_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block22_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block21_out[0][… │
│                           │                        │                │ conv4_block22_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block22_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block22_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_conv      │ (None, 3, 3, 256)      │        262,400 │ conv4_block22_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block23_1_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_1_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block23_1_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_conv      │ (None, 3, 3, 256)      │        590,080 │ conv4_block23_1_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_bn        │ (None, 3, 3, 256)      │          1,024 │ conv4_block23_2_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_2_relu      │ (None, 3, 3, 256)      │              0 │ conv4_block23_2_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_3_conv      │ (None, 3, 3, 1024)     │        263,168 │ conv4_block23_2_relu[… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_3_bn        │ (None, 3, 3, 1024)     │          4,096 │ conv4_block23_3_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_add (Add)   │ (None, 3, 3, 1024)     │              0 │ conv4_block22_out[0][… │
│                           │                        │                │ conv4_block23_3_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv4_block23_out         │ (None, 3, 3, 1024)     │              0 │ conv4_block23_add[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_conv       │ (None, 2, 2, 512)      │        524,800 │ conv4_block23_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block1_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block1_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block1_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block1_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block1_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_0_conv       │ (None, 2, 2, 2048)     │      2,099,200 │ conv4_block23_out[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block1_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_0_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block1_0_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block1_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block1_0_bn[0][… │
│                           │                        │                │ conv5_block1_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block1_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block1_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_conv       │ (None, 2, 2, 512)      │      1,049,088 │ conv5_block1_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block2_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block2_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block2_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block2_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block2_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block2_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block2_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block1_out[0][0… │
│                           │                        │                │ conv5_block2_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block2_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block2_add[0][0] │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_conv       │ (None, 2, 2, 512)      │      1,049,088 │ conv5_block2_out[0][0] │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block3_1_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_1_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block3_1_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_conv       │ (None, 2, 2, 512)      │      2,359,808 │ conv5_block3_1_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_bn         │ (None, 2, 2, 512)      │          2,048 │ conv5_block3_2_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_2_relu       │ (None, 2, 2, 512)      │              0 │ conv5_block3_2_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_3_conv       │ (None, 2, 2, 2048)     │      1,050,624 │ conv5_block3_2_relu[0… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_3_bn         │ (None, 2, 2, 2048)     │          8,192 │ conv5_block3_3_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_add (Add)    │ (None, 2, 2, 2048)     │              0 │ conv5_block2_out[0][0… │
│                           │                        │                │ conv5_block3_3_bn[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv5_block3_out          │ (None, 2, 2, 2048)     │              0 │ conv5_block3_add[0][0] │
│ (Activation)              │                        │                │                        │
└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
 Total params: 42,658,176 (162.73 MB)
 Trainable params: 42,552,832 (162.33 MB)
 Non-trainable params: 105,344 (411.50 KB)
In [115]:
transfer_layer_Resnet = Resnet_model_7.get_layer('conv5_block3_add')

for layer in Resnet_model_7.layers:#UnFreeze all layers
  layer.trainable = True

#Add classification layer
x_model_7 = Flatten()(transfer_layer_Resnet.output)

x_model_7 = Dense(256, activation = 'relu')(x_model_7)

x_model_7 = Dense(128, activation = 'relu')(x_model_7)

x_model_7 = Dropout(0.4)(x_model_7)

x_model_7 = Dense(64, activation = 'relu')(x_model_7)

x_model_7 = BatchNormalization()(x_model_7)

Resnet_pred_model_7 = Dense(4, activation = 'softmax')(x_model_7)

#initialize the model
Resnet_model_7 = Model(Resnet_model_7.input, Resnet_pred_model_7)
In [116]:
#Compiling the model
Resnet_model_7.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [117]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./Resnet_model_7.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [118]:
#Fitting the model
Resnet_model_7_history = Resnet_model_7.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 160s 570ms/step - accuracy: 0.2586 - loss: 1.6461 - val_accuracy: 0.1871 - val_loss: 2.0807
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.3245 - loss: 1.3919 - val_accuracy: 0.2456 - val_loss: 2.0939
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.5104 - loss: 1.1093 - val_accuracy: 0.2296 - val_loss: 1.6406
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.5848 - loss: 0.9516 - val_accuracy: 0.4577 - val_loss: 1.1808
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.5998 - loss: 0.9443 - val_accuracy: 0.4348 - val_loss: 1.2299
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.6266 - loss: 0.8913 - val_accuracy: 0.6398 - val_loss: 0.8547
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.6765 - loss: 0.8013 - val_accuracy: 0.6837 - val_loss: 0.7875
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.6900 - loss: 0.7574 - val_accuracy: 0.6975 - val_loss: 0.7411
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 186ms/step - accuracy: 0.6783 - loss: 0.7817 - val_accuracy: 0.6703 - val_loss: 0.8749
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 185ms/step - accuracy: 0.6992 - loss: 0.7503 - val_accuracy: 0.6384 - val_loss: 0.9528
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.6363 - loss: 0.8530 - val_accuracy: 0.2686 - val_loss: 2.0526
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.5477 - loss: 1.0387 - val_accuracy: 0.5981 - val_loss: 0.9521
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.6074 - loss: 0.9193 - val_accuracy: 0.6420 - val_loss: 0.8593
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.6267 - loss: 0.8722 - val_accuracy: 0.6505 - val_loss: 0.8397
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.6589 - loss: 0.8222 - val_accuracy: 0.6857 - val_loss: 0.7579
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.6714 - loss: 0.7871 - val_accuracy: 0.6808 - val_loss: 0.9371
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.6923 - loss: 0.7463 - val_accuracy: 0.7093 - val_loss: 0.7172
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.7136 - loss: 0.7076 - val_accuracy: 0.7166 - val_loss: 0.7195
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.7225 - loss: 0.6757 - val_accuracy: 0.6997 - val_loss: 0.7500
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.7370 - loss: 0.6539 - val_accuracy: 0.7174 - val_loss: 0.7089
In [119]:
#Save training history
with open("Resnet_model_7_training_history.json","w") as f:
  json.dump(Resnet_model_7_history.history,f)

#Load training history
with open("Resnet_model_7_training_history.json","r") as f:
  Resnet_model_7_history_restored = json.load(f)

#save the trained model
Resnet_model_7.save("Resnet_model_7.keras")

Resnet_model_7_restored = load_model("Resnet_model_7.keras")
In [120]:
#plot training and validation accuracies and loss
dict_hist_7 = Resnet_model_7_history_restored

list_epoch = [i for i in range(1,21)]
list_epoch1 = [i for i in range(6,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  ls = '-.',label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '-.', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_6['accuracy'],  ls = '--', label = 'Resnet_model_6_accuracy_rgb')
plt.plot(list_epoch, dict_hist_6['val_accuracy'],  ls = '--', label = 'Resnet_model_6_validation_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['val_accuracy'][5:],  label = 'Resnet_model_7_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('resnet_model_7_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'],ls = '-.',  label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_6['loss'], ls = '--',  label='Resnet_model_6_loss_rgb')
plt.plot(list_epoch, dict_hist_6['val_loss'], ls = '--', label='Resnet_model_6_validation_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['loss'][5:],  label='Resnet_model_7_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['val_loss'][5:],  label='Resnet_model_7_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('resnet_model_7_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image
In [121]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_Resnet_model_7 = Resnet_model_7_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_Resnet_model_7}")
4/4 - 10s - 3s/step - accuracy: 0.7656 - loss: 0.5891
Model accuracy on the test batch:[0.5890548825263977, 0.765625]
In [122]:
pred_Resnet_model_7 = Resnet_model_7_restored.predict(test_images)
pred_Resnet_model_7 = np.argmax(pred_Resnet_model_7, axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 6s 11ms/step
In [123]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [124]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_Resnet_model_7,'Resnet_Model_7')
              precision    recall  f1-score   support

           0       0.93      0.84      0.89        32
           1       0.78      0.56      0.65        32
           2       0.58      0.88      0.70        32
           3       0.89      0.78      0.83        32

    accuracy                           0.77       128
   macro avg       0.80      0.77      0.77       128
weighted avg       0.80      0.77      0.77       128

No description has been provided for this image
In [125]:
visualizeImages(Resnet_model_7_restored,3,'Resnet_Model_7')
1/1 ━━━━━━━━━━━━━━━━━━━━ 6s 6s/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
No description has been provided for this image

EfficientNet Model¶

In [126]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)

Model Building¶

  • Import EfficientNet upto the layer of your choice and add Fully Connected layers on top of it.
In [127]:
import tensorflow as tf
import tensorflow.keras.applications as ap
from tensorflow.keras import Model
EfficientNet_model_8 = ap.EfficientNetV2B2(include_top=False, weights = "imagenet", input_shape = (48, 48, 3))

EfficientNet_model_8.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/efficientnet_v2/efficientnetv2-b2_notop.h5
35839040/35839040 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Model: "efficientnetv2-b2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)              ┃ Output Shape           ┃        Param # ┃ Connected to           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)  │ (None, 48, 48, 3)      │              0 │ -                      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ rescaling (Rescaling)     │ (None, 48, 48, 3)      │              0 │ input_layer[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ normalization             │ (None, 48, 48, 3)      │              0 │ rescaling[0][0]        │
│ (Normalization)           │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_conv (Conv2D)        │ (None, 24, 24, 32)     │            864 │ normalization[0][0]    │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_bn                   │ (None, 24, 24, 32)     │            128 │ stem_conv[0][0]        │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_activation           │ (None, 24, 24, 32)     │              0 │ stem_bn[0][0]          │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_conv      │ (None, 24, 24, 16)     │          4,608 │ stem_activation[0][0]  │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_bn        │ (None, 24, 24, 16)     │             64 │ block1a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_activati… │ (None, 24, 24, 16)     │              0 │ block1a_project_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_conv      │ (None, 24, 24, 16)     │          2,304 │ block1a_project_activ… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_bn        │ (None, 24, 24, 16)     │             64 │ block1b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_activati… │ (None, 24, 24, 16)     │              0 │ block1b_project_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_drop (Dropout)    │ (None, 24, 24, 16)     │              0 │ block1b_project_activ… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_add (Add)         │ (None, 24, 24, 16)     │              0 │ block1b_drop[0][0],    │
│                           │                        │                │ block1a_project_activ… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_conv       │ (None, 12, 12, 64)     │          9,216 │ block1b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_bn         │ (None, 12, 12, 64)     │            256 │ block2a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_activation │ (None, 12, 12, 64)     │              0 │ block2a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_project_conv      │ (None, 12, 12, 32)     │          2,048 │ block2a_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_project_bn        │ (None, 12, 12, 32)     │            128 │ block2a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_conv       │ (None, 12, 12, 128)    │         36,864 │ block2a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_bn         │ (None, 12, 12, 128)    │            512 │ block2b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_activation │ (None, 12, 12, 128)    │              0 │ block2b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_project_conv      │ (None, 12, 12, 32)     │          4,096 │ block2b_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_project_bn        │ (None, 12, 12, 32)     │            128 │ block2b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_drop (Dropout)    │ (None, 12, 12, 32)     │              0 │ block2b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_add (Add)         │ (None, 12, 12, 32)     │              0 │ block2b_drop[0][0],    │
│                           │                        │                │ block2a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_conv       │ (None, 12, 12, 128)    │         36,864 │ block2b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_bn         │ (None, 12, 12, 128)    │            512 │ block2c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_activation │ (None, 12, 12, 128)    │              0 │ block2c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_project_conv      │ (None, 12, 12, 32)     │          4,096 │ block2c_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_project_bn        │ (None, 12, 12, 32)     │            128 │ block2c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_drop (Dropout)    │ (None, 12, 12, 32)     │              0 │ block2c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_add (Add)         │ (None, 12, 12, 32)     │              0 │ block2c_drop[0][0],    │
│                           │                        │                │ block2b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_conv       │ (None, 6, 6, 128)      │         36,864 │ block2c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_bn         │ (None, 6, 6, 128)      │            512 │ block3a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_activation │ (None, 6, 6, 128)      │              0 │ block3a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_project_conv      │ (None, 6, 6, 56)       │          7,168 │ block3a_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_project_bn        │ (None, 6, 6, 56)       │            224 │ block3a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_conv       │ (None, 6, 6, 224)      │        112,896 │ block3a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_bn         │ (None, 6, 6, 224)      │            896 │ block3b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_activation │ (None, 6, 6, 224)      │              0 │ block3b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_project_conv      │ (None, 6, 6, 56)       │         12,544 │ block3b_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_project_bn        │ (None, 6, 6, 56)       │            224 │ block3b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_drop (Dropout)    │ (None, 6, 6, 56)       │              0 │ block3b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_add (Add)         │ (None, 6, 6, 56)       │              0 │ block3b_drop[0][0],    │
│                           │                        │                │ block3a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_conv       │ (None, 6, 6, 224)      │        112,896 │ block3b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_bn         │ (None, 6, 6, 224)      │            896 │ block3c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_activation │ (None, 6, 6, 224)      │              0 │ block3c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_project_conv      │ (None, 6, 6, 56)       │         12,544 │ block3c_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_project_bn        │ (None, 6, 6, 56)       │            224 │ block3c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_drop (Dropout)    │ (None, 6, 6, 56)       │              0 │ block3c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_add (Add)         │ (None, 6, 6, 56)       │              0 │ block3c_drop[0][0],    │
│                           │                        │                │ block3b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_conv       │ (None, 6, 6, 224)      │         12,544 │ block3c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_bn         │ (None, 6, 6, 224)      │            896 │ block4a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_activation │ (None, 6, 6, 224)      │              0 │ block4a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_dwconv2           │ (None, 3, 3, 224)      │          2,016 │ block4a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_bn                │ (None, 3, 3, 224)      │            896 │ block4a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_activation        │ (None, 3, 3, 224)      │              0 │ block4a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_squeeze        │ (None, 224)            │              0 │ block4a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_reshape        │ (None, 1, 1, 224)      │              0 │ block4a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_reduce         │ (None, 1, 1, 14)       │          3,150 │ block4a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_expand         │ (None, 1, 1, 224)      │          3,360 │ block4a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_excite         │ (None, 3, 3, 224)      │              0 │ block4a_activation[0]… │
│ (Multiply)                │                        │                │ block4a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_project_conv      │ (None, 3, 3, 104)      │         23,296 │ block4a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_project_bn        │ (None, 3, 3, 104)      │            416 │ block4a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_activation │ (None, 3, 3, 416)      │              0 │ block4b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_bn                │ (None, 3, 3, 416)      │          1,664 │ block4b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_activation        │ (None, 3, 3, 416)      │              0 │ block4b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_squeeze        │ (None, 416)            │              0 │ block4b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_excite         │ (None, 3, 3, 416)      │              0 │ block4b_activation[0]… │
│ (Multiply)                │                        │                │ block4b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_project_bn        │ (None, 3, 3, 104)      │            416 │ block4b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4b_drop[0][0],    │
│                           │                        │                │ block4a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_activation │ (None, 3, 3, 416)      │              0 │ block4c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_bn                │ (None, 3, 3, 416)      │          1,664 │ block4c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_activation        │ (None, 3, 3, 416)      │              0 │ block4c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_squeeze        │ (None, 416)            │              0 │ block4c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_excite         │ (None, 3, 3, 416)      │              0 │ block4c_activation[0]… │
│ (Multiply)                │                        │                │ block4c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_project_bn        │ (None, 3, 3, 104)      │            416 │ block4c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4c_drop[0][0],    │
│                           │                        │                │ block4b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_activation │ (None, 3, 3, 416)      │              0 │ block4d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_bn                │ (None, 3, 3, 416)      │          1,664 │ block4d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_activation        │ (None, 3, 3, 416)      │              0 │ block4d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_squeeze        │ (None, 416)            │              0 │ block4d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_excite         │ (None, 3, 3, 416)      │              0 │ block4d_activation[0]… │
│ (Multiply)                │                        │                │ block4d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_project_bn        │ (None, 3, 3, 104)      │            416 │ block4d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4d_drop[0][0],    │
│                           │                        │                │ block4c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_conv       │ (None, 3, 3, 624)      │         64,896 │ block4d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_bn         │ (None, 3, 3, 624)      │          2,496 │ block5a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_activation │ (None, 3, 3, 624)      │              0 │ block5a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_dwconv2           │ (None, 3, 3, 624)      │          5,616 │ block5a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_bn                │ (None, 3, 3, 624)      │          2,496 │ block5a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_activation        │ (None, 3, 3, 624)      │              0 │ block5a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_squeeze        │ (None, 624)            │              0 │ block5a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_reshape        │ (None, 1, 1, 624)      │              0 │ block5a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_reduce         │ (None, 1, 1, 26)       │         16,250 │ block5a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_expand         │ (None, 1, 1, 624)      │         16,848 │ block5a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_excite         │ (None, 3, 3, 624)      │              0 │ block5a_activation[0]… │
│ (Multiply)                │                        │                │ block5a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_project_conv      │ (None, 3, 3, 120)      │         74,880 │ block5a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_project_bn        │ (None, 3, 3, 120)      │            480 │ block5a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_activation │ (None, 3, 3, 720)      │              0 │ block5b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_bn                │ (None, 3, 3, 720)      │          2,880 │ block5b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_activation        │ (None, 3, 3, 720)      │              0 │ block5b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_squeeze        │ (None, 720)            │              0 │ block5b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_excite         │ (None, 3, 3, 720)      │              0 │ block5b_activation[0]… │
│ (Multiply)                │                        │                │ block5b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_project_bn        │ (None, 3, 3, 120)      │            480 │ block5b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5b_drop[0][0],    │
│                           │                        │                │ block5a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_activation │ (None, 3, 3, 720)      │              0 │ block5c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_bn                │ (None, 3, 3, 720)      │          2,880 │ block5c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_activation        │ (None, 3, 3, 720)      │              0 │ block5c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_squeeze        │ (None, 720)            │              0 │ block5c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_excite         │ (None, 3, 3, 720)      │              0 │ block5c_activation[0]… │
│ (Multiply)                │                        │                │ block5c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_project_bn        │ (None, 3, 3, 120)      │            480 │ block5c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5c_drop[0][0],    │
│                           │                        │                │ block5b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_activation │ (None, 3, 3, 720)      │              0 │ block5d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_bn                │ (None, 3, 3, 720)      │          2,880 │ block5d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_activation        │ (None, 3, 3, 720)      │              0 │ block5d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_squeeze        │ (None, 720)            │              0 │ block5d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_excite         │ (None, 3, 3, 720)      │              0 │ block5d_activation[0]… │
│ (Multiply)                │                        │                │ block5d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_project_bn        │ (None, 3, 3, 120)      │            480 │ block5d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5d_drop[0][0],    │
│                           │                        │                │ block5c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5e_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_activation │ (None, 3, 3, 720)      │              0 │ block5e_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5e_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_bn                │ (None, 3, 3, 720)      │          2,880 │ block5e_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_activation        │ (None, 3, 3, 720)      │              0 │ block5e_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_squeeze        │ (None, 720)            │              0 │ block5e_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5e_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5e_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5e_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_excite         │ (None, 3, 3, 720)      │              0 │ block5e_activation[0]… │
│ (Multiply)                │                        │                │ block5e_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5e_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_project_bn        │ (None, 3, 3, 120)      │            480 │ block5e_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5e_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5e_drop[0][0],    │
│                           │                        │                │ block5d_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5e_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5f_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_activation │ (None, 3, 3, 720)      │              0 │ block5f_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5f_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_bn                │ (None, 3, 3, 720)      │          2,880 │ block5f_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_activation        │ (None, 3, 3, 720)      │              0 │ block5f_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_squeeze        │ (None, 720)            │              0 │ block5f_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5f_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5f_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5f_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_excite         │ (None, 3, 3, 720)      │              0 │ block5f_activation[0]… │
│ (Multiply)                │                        │                │ block5f_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5f_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_project_bn        │ (None, 3, 3, 120)      │            480 │ block5f_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5f_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5f_drop[0][0],    │
│                           │                        │                │ block5e_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5f_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block6a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_activation │ (None, 3, 3, 720)      │              0 │ block6a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_dwconv2           │ (None, 2, 2, 720)      │          6,480 │ block6a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_bn                │ (None, 2, 2, 720)      │          2,880 │ block6a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_activation        │ (None, 2, 2, 720)      │              0 │ block6a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_squeeze        │ (None, 720)            │              0 │ block6a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_reshape        │ (None, 1, 1, 720)      │              0 │ block6a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block6a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block6a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_excite         │ (None, 2, 2, 720)      │              0 │ block6a_activation[0]… │
│ (Multiply)                │                        │                │ block6a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_project_conv      │ (None, 2, 2, 208)      │        149,760 │ block6a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_project_bn        │ (None, 2, 2, 208)      │            832 │ block6a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_activation        │ (None, 2, 2, 1248)     │              0 │ block6b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_squeeze        │ (None, 1248)           │              0 │ block6b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6b_activation[0]… │
│ (Multiply)                │                        │                │ block6b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_project_bn        │ (None, 2, 2, 208)      │            832 │ block6b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6b_drop[0][0],    │
│                           │                        │                │ block6a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_activation        │ (None, 2, 2, 1248)     │              0 │ block6c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_squeeze        │ (None, 1248)           │              0 │ block6c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6c_activation[0]… │
│ (Multiply)                │                        │                │ block6c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_project_bn        │ (None, 2, 2, 208)      │            832 │ block6c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6c_drop[0][0],    │
│                           │                        │                │ block6b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_activation        │ (None, 2, 2, 1248)     │              0 │ block6d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_squeeze        │ (None, 1248)           │              0 │ block6d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6d_activation[0]… │
│ (Multiply)                │                        │                │ block6d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_project_bn        │ (None, 2, 2, 208)      │            832 │ block6d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6d_drop[0][0],    │
│                           │                        │                │ block6c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6e_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6e_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6e_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6e_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_activation        │ (None, 2, 2, 1248)     │              0 │ block6e_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_squeeze        │ (None, 1248)           │              0 │ block6e_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6e_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6e_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6e_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6e_activation[0]… │
│ (Multiply)                │                        │                │ block6e_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6e_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_project_bn        │ (None, 2, 2, 208)      │            832 │ block6e_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6e_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6e_drop[0][0],    │
│                           │                        │                │ block6d_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6e_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6f_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6f_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6f_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6f_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_activation        │ (None, 2, 2, 1248)     │              0 │ block6f_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_squeeze        │ (None, 1248)           │              0 │ block6f_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6f_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6f_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6f_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6f_activation[0]… │
│ (Multiply)                │                        │                │ block6f_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6f_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_project_bn        │ (None, 2, 2, 208)      │            832 │ block6f_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6f_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6f_drop[0][0],    │
│                           │                        │                │ block6e_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6f_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6g_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6g_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6g_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6g_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_activation        │ (None, 2, 2, 1248)     │              0 │ block6g_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_squeeze        │ (None, 1248)           │              0 │ block6g_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6g_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6g_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6g_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6g_activation[0]… │
│ (Multiply)                │                        │                │ block6g_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6g_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_project_bn        │ (None, 2, 2, 208)      │            832 │ block6g_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6g_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6g_drop[0][0],    │
│                           │                        │                │ block6f_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6g_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6h_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6h_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6h_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6h_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_activation        │ (None, 2, 2, 1248)     │              0 │ block6h_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_squeeze        │ (None, 1248)           │              0 │ block6h_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6h_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6h_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6h_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6h_activation[0]… │
│ (Multiply)                │                        │                │ block6h_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6h_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_project_bn        │ (None, 2, 2, 208)      │            832 │ block6h_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6h_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6h_drop[0][0],    │
│                           │                        │                │ block6g_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6h_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6i_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6i_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6i_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6i_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_activation        │ (None, 2, 2, 1248)     │              0 │ block6i_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_squeeze        │ (None, 1248)           │              0 │ block6i_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6i_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6i_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6i_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6i_activation[0]… │
│ (Multiply)                │                        │                │ block6i_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6i_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_project_bn        │ (None, 2, 2, 208)      │            832 │ block6i_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6i_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6i_drop[0][0],    │
│                           │                        │                │ block6h_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6i_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6j_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6j_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6j_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6j_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_activation        │ (None, 2, 2, 1248)     │              0 │ block6j_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_squeeze        │ (None, 1248)           │              0 │ block6j_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6j_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6j_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6j_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6j_activation[0]… │
│ (Multiply)                │                        │                │ block6j_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6j_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_project_bn        │ (None, 2, 2, 208)      │            832 │ block6j_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6j_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6j_drop[0][0],    │
│                           │                        │                │ block6i_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_conv (Conv2D)         │ (None, 2, 2, 1408)     │        292,864 │ block6j_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_bn                    │ (None, 2, 2, 1408)     │          5,632 │ top_conv[0][0]         │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_activation            │ (None, 2, 2, 1408)     │              0 │ top_bn[0][0]           │
│ (Activation)              │                        │                │                        │
└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
 Total params: 8,769,374 (33.45 MB)
 Trainable params: 8,687,086 (33.14 MB)
 Non-trainable params: 82,288 (321.44 KB)
In [128]:
from tensorflow.keras.utils import plot_model
from IPython.display import Image

plot_model(EfficientNet_model_8, to_file="EfficientNet_model_plot.png", show_shapes = True, show_layer_names=True)
Image(filename="EfficientNet_model_plot.png")
Output hidden; open in https://colab.research.google.com to view.
In [129]:
transfer_layer_EfficientNet = EfficientNet_model_8.get_layer('block6j_expand_activation')
EfficientNet_model_8.trainable = False

#Add classification layer
x_model_8 = Flatten()(transfer_layer_EfficientNet.output)

x_model_8 = Dense(256, activation = 'relu')(x_model_8)

x_model_8 = Dense(128, activation = 'relu')(x_model_8)

x_model_8 = Dropout(0.3)(x_model_8)

x_model_8 = Dense(64, activation = 'relu')(x_model_8)

x_model_8 = BatchNormalization()(x_model_8)

EfficientNet_pred_model_8 = Dense(4, activation = 'softmax')(x_model_8)

#initialize the model
EfficientNet_model_8 = Model(EfficientNet_model_8.input, EfficientNet_pred_model_8)

Compiling and Training the Model¶

In [130]:
#Compiling the model
EfficientNet_model_8.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [131]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./EfficientNet_model_8.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [132]:
#Fitting the model
EfficientNet_model_8_history = EfficientNet_model_8.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 80s 429ms/step - accuracy: 0.2624 - loss: 1.6696 - val_accuracy: 0.2292 - val_loss: 1.4381
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2626 - loss: 1.4526 - val_accuracy: 0.3698 - val_loss: 1.3568
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2667 - loss: 1.4142 - val_accuracy: 0.2456 - val_loss: 1.3707
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2741 - loss: 1.3933 - val_accuracy: 0.2456 - val_loss: 1.3737
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2768 - loss: 1.3853 - val_accuracy: 0.3698 - val_loss: 1.3538
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2782 - loss: 1.3858 - val_accuracy: 0.2456 - val_loss: 1.3584
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2737 - loss: 1.3838 - val_accuracy: 0.3698 - val_loss: 1.3444
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2827 - loss: 1.3850 - val_accuracy: 0.2456 - val_loss: 1.3558
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2716 - loss: 1.3801 - val_accuracy: 0.2456 - val_loss: 1.3609
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2678 - loss: 1.3845 - val_accuracy: 0.2456 - val_loss: 1.3731
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2675 - loss: 1.3845 - val_accuracy: 0.3698 - val_loss: 1.3482
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.2703 - loss: 1.3796 - val_accuracy: 0.2456 - val_loss: 1.3669
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2686 - loss: 1.3829 - val_accuracy: 0.2456 - val_loss: 1.3785
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2772 - loss: 1.3794 - val_accuracy: 0.3698 - val_loss: 1.3579
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2680 - loss: 1.3831 - val_accuracy: 0.2456 - val_loss: 1.3730
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 179ms/step - accuracy: 0.2669 - loss: 1.3789 - val_accuracy: 0.2292 - val_loss: 1.3756
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2684 - loss: 1.3786 - val_accuracy: 0.2292 - val_loss: 1.3638
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2634 - loss: 1.3808 - val_accuracy: 0.2456 - val_loss: 1.3614
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 178ms/step - accuracy: 0.2778 - loss: 1.3774 - val_accuracy: 0.2292 - val_loss: 1.3792
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2681 - loss: 1.3800 - val_accuracy: 0.3698 - val_loss: 1.3562
In [133]:
#Save training history
with open("EfficientNet_model_8_training_history.json","w") as f:
  json.dump(EfficientNet_model_8_history.history,f)

#Load training history
with open("EfficientNet_model_8_training_history.json","r") as f:
  EfficientNet_model_8_history_restored = json.load(f)

#save the trained model
EfficientNet_model_8.save("EfficientNet_model_8.keras")

EfficientNet_model_8_restored = load_model("EfficientNet_model_8.keras")
In [134]:
#plot training and validation accuracies and loss
dict_hist_8 = EfficientNet_model_8_history_restored

list_epoch = [i for i in range(1,21)]
list_epoch1 = [i for i in range(6,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  ls = '-.',label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '-.', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['val_accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch, dict_hist_8['accuracy'],  ls = '-.',label = 'EfficientNet_model_8_accuracy_rgb')
plt.plot(list_epoch, dict_hist_8['val_accuracy'], ls = '-.', label = 'EfficientNet_model_8_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('EfficientNet_model_8_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'],ls = '-.',  label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['loss'][5:],  label='Resnet_model_7_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['val_loss'][5:],  label='Resnet_model_7_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_8['val_loss'], ls = '-.', label='EfficientNet_model_8_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_8['loss'], ls = '--',  label='EfficientNet_model_8_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('EfficientNet_model_8_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image

Evaluating the EfficientnetNet Model¶

Observations and Insights:__

  1. Unfortunately importing EfficientNet pre-trained model from the 'block6j_expand_activation' layer and adding a classification layer does not yield good results. The model does not learn the features of the images after 20 epochs with the training and validation accuracy remaining at ~27% and ~22% respectively.
  2. There is no improvement in accuracy or validation loss from one epoch to another.
  3. We need to improve the ability of the model to learn from the training images.
  4. We will attempt allowing several layers of the pre-trained model to learn new weights from the training images and see if this improves model ability to predict facial emotions.

Note: You can even go back and build your own architecture on top of the EfficientNet Transfer layer and see if you can improve the performance.

In [135]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [136]:
import tensorflow as tf
import tensorflow.keras.applications as ap
from tensorflow.keras import Model
EfficientNet_model_9 = ap.EfficientNetV2B2(include_top=False, weights = "imagenet", input_shape = (48, 48, 3))

EfficientNet_model_9.summary()
Model: "efficientnetv2-b2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)              ┃ Output Shape           ┃        Param # ┃ Connected to           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)  │ (None, 48, 48, 3)      │              0 │ -                      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ rescaling (Rescaling)     │ (None, 48, 48, 3)      │              0 │ input_layer[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ normalization             │ (None, 48, 48, 3)      │              0 │ rescaling[0][0]        │
│ (Normalization)           │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_conv (Conv2D)        │ (None, 24, 24, 32)     │            864 │ normalization[0][0]    │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_bn                   │ (None, 24, 24, 32)     │            128 │ stem_conv[0][0]        │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ stem_activation           │ (None, 24, 24, 32)     │              0 │ stem_bn[0][0]          │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_conv      │ (None, 24, 24, 16)     │          4,608 │ stem_activation[0][0]  │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_bn        │ (None, 24, 24, 16)     │             64 │ block1a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1a_project_activati… │ (None, 24, 24, 16)     │              0 │ block1a_project_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_conv      │ (None, 24, 24, 16)     │          2,304 │ block1a_project_activ… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_bn        │ (None, 24, 24, 16)     │             64 │ block1b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_project_activati… │ (None, 24, 24, 16)     │              0 │ block1b_project_bn[0]… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_drop (Dropout)    │ (None, 24, 24, 16)     │              0 │ block1b_project_activ… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block1b_add (Add)         │ (None, 24, 24, 16)     │              0 │ block1b_drop[0][0],    │
│                           │                        │                │ block1a_project_activ… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_conv       │ (None, 12, 12, 64)     │          9,216 │ block1b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_bn         │ (None, 12, 12, 64)     │            256 │ block2a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_expand_activation │ (None, 12, 12, 64)     │              0 │ block2a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_project_conv      │ (None, 12, 12, 32)     │          2,048 │ block2a_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2a_project_bn        │ (None, 12, 12, 32)     │            128 │ block2a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_conv       │ (None, 12, 12, 128)    │         36,864 │ block2a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_bn         │ (None, 12, 12, 128)    │            512 │ block2b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_expand_activation │ (None, 12, 12, 128)    │              0 │ block2b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_project_conv      │ (None, 12, 12, 32)     │          4,096 │ block2b_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_project_bn        │ (None, 12, 12, 32)     │            128 │ block2b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_drop (Dropout)    │ (None, 12, 12, 32)     │              0 │ block2b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2b_add (Add)         │ (None, 12, 12, 32)     │              0 │ block2b_drop[0][0],    │
│                           │                        │                │ block2a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_conv       │ (None, 12, 12, 128)    │         36,864 │ block2b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_bn         │ (None, 12, 12, 128)    │            512 │ block2c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_expand_activation │ (None, 12, 12, 128)    │              0 │ block2c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_project_conv      │ (None, 12, 12, 32)     │          4,096 │ block2c_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_project_bn        │ (None, 12, 12, 32)     │            128 │ block2c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_drop (Dropout)    │ (None, 12, 12, 32)     │              0 │ block2c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block2c_add (Add)         │ (None, 12, 12, 32)     │              0 │ block2c_drop[0][0],    │
│                           │                        │                │ block2b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_conv       │ (None, 6, 6, 128)      │         36,864 │ block2c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_bn         │ (None, 6, 6, 128)      │            512 │ block3a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_expand_activation │ (None, 6, 6, 128)      │              0 │ block3a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_project_conv      │ (None, 6, 6, 56)       │          7,168 │ block3a_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3a_project_bn        │ (None, 6, 6, 56)       │            224 │ block3a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_conv       │ (None, 6, 6, 224)      │        112,896 │ block3a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_bn         │ (None, 6, 6, 224)      │            896 │ block3b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_expand_activation │ (None, 6, 6, 224)      │              0 │ block3b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_project_conv      │ (None, 6, 6, 56)       │         12,544 │ block3b_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_project_bn        │ (None, 6, 6, 56)       │            224 │ block3b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_drop (Dropout)    │ (None, 6, 6, 56)       │              0 │ block3b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3b_add (Add)         │ (None, 6, 6, 56)       │              0 │ block3b_drop[0][0],    │
│                           │                        │                │ block3a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_conv       │ (None, 6, 6, 224)      │        112,896 │ block3b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_bn         │ (None, 6, 6, 224)      │            896 │ block3c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_expand_activation │ (None, 6, 6, 224)      │              0 │ block3c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_project_conv      │ (None, 6, 6, 56)       │         12,544 │ block3c_expand_activa… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_project_bn        │ (None, 6, 6, 56)       │            224 │ block3c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_drop (Dropout)    │ (None, 6, 6, 56)       │              0 │ block3c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block3c_add (Add)         │ (None, 6, 6, 56)       │              0 │ block3c_drop[0][0],    │
│                           │                        │                │ block3b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_conv       │ (None, 6, 6, 224)      │         12,544 │ block3c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_bn         │ (None, 6, 6, 224)      │            896 │ block4a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_expand_activation │ (None, 6, 6, 224)      │              0 │ block4a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_dwconv2           │ (None, 3, 3, 224)      │          2,016 │ block4a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_bn                │ (None, 3, 3, 224)      │            896 │ block4a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_activation        │ (None, 3, 3, 224)      │              0 │ block4a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_squeeze        │ (None, 224)            │              0 │ block4a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_reshape        │ (None, 1, 1, 224)      │              0 │ block4a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_reduce         │ (None, 1, 1, 14)       │          3,150 │ block4a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_expand         │ (None, 1, 1, 224)      │          3,360 │ block4a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_se_excite         │ (None, 3, 3, 224)      │              0 │ block4a_activation[0]… │
│ (Multiply)                │                        │                │ block4a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_project_conv      │ (None, 3, 3, 104)      │         23,296 │ block4a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4a_project_bn        │ (None, 3, 3, 104)      │            416 │ block4a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_expand_activation │ (None, 3, 3, 416)      │              0 │ block4b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_bn                │ (None, 3, 3, 416)      │          1,664 │ block4b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_activation        │ (None, 3, 3, 416)      │              0 │ block4b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_squeeze        │ (None, 416)            │              0 │ block4b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_se_excite         │ (None, 3, 3, 416)      │              0 │ block4b_activation[0]… │
│ (Multiply)                │                        │                │ block4b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_project_bn        │ (None, 3, 3, 104)      │            416 │ block4b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4b_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4b_drop[0][0],    │
│                           │                        │                │ block4a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_expand_activation │ (None, 3, 3, 416)      │              0 │ block4c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_bn                │ (None, 3, 3, 416)      │          1,664 │ block4c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_activation        │ (None, 3, 3, 416)      │              0 │ block4c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_squeeze        │ (None, 416)            │              0 │ block4c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_se_excite         │ (None, 3, 3, 416)      │              0 │ block4c_activation[0]… │
│ (Multiply)                │                        │                │ block4c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_project_bn        │ (None, 3, 3, 104)      │            416 │ block4c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4c_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4c_drop[0][0],    │
│                           │                        │                │ block4b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_conv       │ (None, 3, 3, 416)      │         43,264 │ block4c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_bn         │ (None, 3, 3, 416)      │          1,664 │ block4d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_expand_activation │ (None, 3, 3, 416)      │              0 │ block4d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_dwconv2           │ (None, 3, 3, 416)      │          3,744 │ block4d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_bn                │ (None, 3, 3, 416)      │          1,664 │ block4d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_activation        │ (None, 3, 3, 416)      │              0 │ block4d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_squeeze        │ (None, 416)            │              0 │ block4d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_reshape        │ (None, 1, 1, 416)      │              0 │ block4d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_reduce         │ (None, 1, 1, 26)       │         10,842 │ block4d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_expand         │ (None, 1, 1, 416)      │         11,232 │ block4d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_se_excite         │ (None, 3, 3, 416)      │              0 │ block4d_activation[0]… │
│ (Multiply)                │                        │                │ block4d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_project_conv      │ (None, 3, 3, 104)      │         43,264 │ block4d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_project_bn        │ (None, 3, 3, 104)      │            416 │ block4d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_drop (Dropout)    │ (None, 3, 3, 104)      │              0 │ block4d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block4d_add (Add)         │ (None, 3, 3, 104)      │              0 │ block4d_drop[0][0],    │
│                           │                        │                │ block4c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_conv       │ (None, 3, 3, 624)      │         64,896 │ block4d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_bn         │ (None, 3, 3, 624)      │          2,496 │ block5a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_expand_activation │ (None, 3, 3, 624)      │              0 │ block5a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_dwconv2           │ (None, 3, 3, 624)      │          5,616 │ block5a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_bn                │ (None, 3, 3, 624)      │          2,496 │ block5a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_activation        │ (None, 3, 3, 624)      │              0 │ block5a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_squeeze        │ (None, 624)            │              0 │ block5a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_reshape        │ (None, 1, 1, 624)      │              0 │ block5a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_reduce         │ (None, 1, 1, 26)       │         16,250 │ block5a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_expand         │ (None, 1, 1, 624)      │         16,848 │ block5a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_se_excite         │ (None, 3, 3, 624)      │              0 │ block5a_activation[0]… │
│ (Multiply)                │                        │                │ block5a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_project_conv      │ (None, 3, 3, 120)      │         74,880 │ block5a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5a_project_bn        │ (None, 3, 3, 120)      │            480 │ block5a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_expand_activation │ (None, 3, 3, 720)      │              0 │ block5b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_bn                │ (None, 3, 3, 720)      │          2,880 │ block5b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_activation        │ (None, 3, 3, 720)      │              0 │ block5b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_squeeze        │ (None, 720)            │              0 │ block5b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_se_excite         │ (None, 3, 3, 720)      │              0 │ block5b_activation[0]… │
│ (Multiply)                │                        │                │ block5b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_project_bn        │ (None, 3, 3, 120)      │            480 │ block5b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5b_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5b_drop[0][0],    │
│                           │                        │                │ block5a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_expand_activation │ (None, 3, 3, 720)      │              0 │ block5c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_bn                │ (None, 3, 3, 720)      │          2,880 │ block5c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_activation        │ (None, 3, 3, 720)      │              0 │ block5c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_squeeze        │ (None, 720)            │              0 │ block5c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_se_excite         │ (None, 3, 3, 720)      │              0 │ block5c_activation[0]… │
│ (Multiply)                │                        │                │ block5c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_project_bn        │ (None, 3, 3, 120)      │            480 │ block5c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5c_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5c_drop[0][0],    │
│                           │                        │                │ block5b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_expand_activation │ (None, 3, 3, 720)      │              0 │ block5d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_bn                │ (None, 3, 3, 720)      │          2,880 │ block5d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_activation        │ (None, 3, 3, 720)      │              0 │ block5d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_squeeze        │ (None, 720)            │              0 │ block5d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_se_excite         │ (None, 3, 3, 720)      │              0 │ block5d_activation[0]… │
│ (Multiply)                │                        │                │ block5d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_project_bn        │ (None, 3, 3, 120)      │            480 │ block5d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5d_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5d_drop[0][0],    │
│                           │                        │                │ block5c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5e_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_expand_activation │ (None, 3, 3, 720)      │              0 │ block5e_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5e_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_bn                │ (None, 3, 3, 720)      │          2,880 │ block5e_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_activation        │ (None, 3, 3, 720)      │              0 │ block5e_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_squeeze        │ (None, 720)            │              0 │ block5e_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5e_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5e_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5e_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_se_excite         │ (None, 3, 3, 720)      │              0 │ block5e_activation[0]… │
│ (Multiply)                │                        │                │ block5e_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5e_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_project_bn        │ (None, 3, 3, 120)      │            480 │ block5e_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5e_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5e_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5e_drop[0][0],    │
│                           │                        │                │ block5d_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5e_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block5f_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_expand_activation │ (None, 3, 3, 720)      │              0 │ block5f_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_dwconv2           │ (None, 3, 3, 720)      │          6,480 │ block5f_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_bn                │ (None, 3, 3, 720)      │          2,880 │ block5f_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_activation        │ (None, 3, 3, 720)      │              0 │ block5f_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_squeeze        │ (None, 720)            │              0 │ block5f_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_reshape        │ (None, 1, 1, 720)      │              0 │ block5f_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block5f_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block5f_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_se_excite         │ (None, 3, 3, 720)      │              0 │ block5f_activation[0]… │
│ (Multiply)                │                        │                │ block5f_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_project_conv      │ (None, 3, 3, 120)      │         86,400 │ block5f_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_project_bn        │ (None, 3, 3, 120)      │            480 │ block5f_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_drop (Dropout)    │ (None, 3, 3, 120)      │              0 │ block5f_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block5f_add (Add)         │ (None, 3, 3, 120)      │              0 │ block5f_drop[0][0],    │
│                           │                        │                │ block5e_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_conv       │ (None, 3, 3, 720)      │         86,400 │ block5f_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_bn         │ (None, 3, 3, 720)      │          2,880 │ block6a_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_expand_activation │ (None, 3, 3, 720)      │              0 │ block6a_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_dwconv2           │ (None, 2, 2, 720)      │          6,480 │ block6a_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_bn                │ (None, 2, 2, 720)      │          2,880 │ block6a_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_activation        │ (None, 2, 2, 720)      │              0 │ block6a_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_squeeze        │ (None, 720)            │              0 │ block6a_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_reshape        │ (None, 1, 1, 720)      │              0 │ block6a_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_reduce         │ (None, 1, 1, 30)       │         21,630 │ block6a_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_expand         │ (None, 1, 1, 720)      │         22,320 │ block6a_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_se_excite         │ (None, 2, 2, 720)      │              0 │ block6a_activation[0]… │
│ (Multiply)                │                        │                │ block6a_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_project_conv      │ (None, 2, 2, 208)      │        149,760 │ block6a_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6a_project_bn        │ (None, 2, 2, 208)      │            832 │ block6a_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6a_project_bn[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6b_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6b_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6b_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6b_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_activation        │ (None, 2, 2, 1248)     │              0 │ block6b_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_squeeze        │ (None, 1248)           │              0 │ block6b_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6b_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6b_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6b_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6b_activation[0]… │
│ (Multiply)                │                        │                │ block6b_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6b_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_project_bn        │ (None, 2, 2, 208)      │            832 │ block6b_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6b_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6b_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6b_drop[0][0],    │
│                           │                        │                │ block6a_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6b_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6c_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6c_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6c_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6c_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_activation        │ (None, 2, 2, 1248)     │              0 │ block6c_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_squeeze        │ (None, 1248)           │              0 │ block6c_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6c_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6c_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6c_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6c_activation[0]… │
│ (Multiply)                │                        │                │ block6c_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6c_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_project_bn        │ (None, 2, 2, 208)      │            832 │ block6c_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6c_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6c_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6c_drop[0][0],    │
│                           │                        │                │ block6b_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6c_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6d_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6d_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6d_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6d_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_activation        │ (None, 2, 2, 1248)     │              0 │ block6d_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_squeeze        │ (None, 1248)           │              0 │ block6d_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6d_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6d_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6d_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6d_activation[0]… │
│ (Multiply)                │                        │                │ block6d_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6d_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_project_bn        │ (None, 2, 2, 208)      │            832 │ block6d_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6d_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6d_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6d_drop[0][0],    │
│                           │                        │                │ block6c_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6d_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6e_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6e_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6e_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6e_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_activation        │ (None, 2, 2, 1248)     │              0 │ block6e_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_squeeze        │ (None, 1248)           │              0 │ block6e_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6e_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6e_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6e_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6e_activation[0]… │
│ (Multiply)                │                        │                │ block6e_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6e_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_project_bn        │ (None, 2, 2, 208)      │            832 │ block6e_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6e_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6e_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6e_drop[0][0],    │
│                           │                        │                │ block6d_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6e_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6f_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6f_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6f_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6f_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_activation        │ (None, 2, 2, 1248)     │              0 │ block6f_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_squeeze        │ (None, 1248)           │              0 │ block6f_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6f_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6f_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6f_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6f_activation[0]… │
│ (Multiply)                │                        │                │ block6f_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6f_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_project_bn        │ (None, 2, 2, 208)      │            832 │ block6f_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6f_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6f_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6f_drop[0][0],    │
│                           │                        │                │ block6e_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6f_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6g_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6g_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6g_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6g_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_activation        │ (None, 2, 2, 1248)     │              0 │ block6g_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_squeeze        │ (None, 1248)           │              0 │ block6g_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6g_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6g_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6g_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6g_activation[0]… │
│ (Multiply)                │                        │                │ block6g_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6g_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_project_bn        │ (None, 2, 2, 208)      │            832 │ block6g_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6g_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6g_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6g_drop[0][0],    │
│                           │                        │                │ block6f_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6g_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6h_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6h_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6h_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6h_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_activation        │ (None, 2, 2, 1248)     │              0 │ block6h_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_squeeze        │ (None, 1248)           │              0 │ block6h_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6h_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6h_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6h_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6h_activation[0]… │
│ (Multiply)                │                        │                │ block6h_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6h_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_project_bn        │ (None, 2, 2, 208)      │            832 │ block6h_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6h_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6h_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6h_drop[0][0],    │
│                           │                        │                │ block6g_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6h_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6i_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6i_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6i_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6i_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_activation        │ (None, 2, 2, 1248)     │              0 │ block6i_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_squeeze        │ (None, 1248)           │              0 │ block6i_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6i_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6i_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6i_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6i_activation[0]… │
│ (Multiply)                │                        │                │ block6i_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6i_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_project_bn        │ (None, 2, 2, 208)      │            832 │ block6i_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6i_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6i_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6i_drop[0][0],    │
│                           │                        │                │ block6h_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_conv       │ (None, 2, 2, 1248)     │        259,584 │ block6i_add[0][0]      │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_bn         │ (None, 2, 2, 1248)     │          4,992 │ block6j_expand_conv[0… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_expand_activation │ (None, 2, 2, 1248)     │              0 │ block6j_expand_bn[0][… │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_dwconv2           │ (None, 2, 2, 1248)     │         11,232 │ block6j_expand_activa… │
│ (DepthwiseConv2D)         │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_bn                │ (None, 2, 2, 1248)     │          4,992 │ block6j_dwconv2[0][0]  │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_activation        │ (None, 2, 2, 1248)     │              0 │ block6j_bn[0][0]       │
│ (Activation)              │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_squeeze        │ (None, 1248)           │              0 │ block6j_activation[0]… │
│ (GlobalAveragePooling2D)  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_reshape        │ (None, 1, 1, 1248)     │              0 │ block6j_se_squeeze[0]… │
│ (Reshape)                 │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_reduce         │ (None, 1, 1, 52)       │         64,948 │ block6j_se_reshape[0]… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_expand         │ (None, 1, 1, 1248)     │         66,144 │ block6j_se_reduce[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_se_excite         │ (None, 2, 2, 1248)     │              0 │ block6j_activation[0]… │
│ (Multiply)                │                        │                │ block6j_se_expand[0][… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_project_conv      │ (None, 2, 2, 208)      │        259,584 │ block6j_se_excite[0][… │
│ (Conv2D)                  │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_project_bn        │ (None, 2, 2, 208)      │            832 │ block6j_project_conv[… │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_drop (Dropout)    │ (None, 2, 2, 208)      │              0 │ block6j_project_bn[0]… │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ block6j_add (Add)         │ (None, 2, 2, 208)      │              0 │ block6j_drop[0][0],    │
│                           │                        │                │ block6i_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_conv (Conv2D)         │ (None, 2, 2, 1408)     │        292,864 │ block6j_add[0][0]      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_bn                    │ (None, 2, 2, 1408)     │          5,632 │ top_conv[0][0]         │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ top_activation            │ (None, 2, 2, 1408)     │              0 │ top_bn[0][0]           │
│ (Activation)              │                        │                │                        │
└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
 Total params: 8,769,374 (33.45 MB)
 Trainable params: 8,687,086 (33.14 MB)
 Non-trainable params: 82,288 (321.44 KB)
In [137]:
transfer_layer_EfficientNet = EfficientNet_model_9.get_layer('block6j_expand_activation')

for layer in EfficientNet_model_9.layers:#UnFreeze all layers
  layer.trainable = True

#Add classification layer
x_model_9 = Flatten()(transfer_layer_EfficientNet.output)

x_model_9 = Dense(256, activation = 'relu')(x_model_9)

x_model_9 = Dense(128, activation = 'relu')(x_model_9)

x_model_9 = Dropout(0.3)(x_model_9)

x_model_9 = Dense(64, activation = 'relu')(x_model_9)

x_model_9 = BatchNormalization()(x_model_9)

EfficientNet_pred_model_9 = Dense(4, activation = 'softmax')(x_model_9)

#initialize the model
EfficientNet_model_9 = Model(EfficientNet_model_9.input, EfficientNet_pred_model_9)
In [138]:
#Compiling the model
EfficientNet_model_9.compile(loss = 'categorical_crossentropy',
                    optimizer = Adam(learning_rate = 0.0005),
                    metrics = ['accuracy'])
In [139]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./EfficientNet_model_9.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [140]:
#Fitting the model
EfficientNet_model_9_history = EfficientNet_model_9.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 174s 689ms/step - accuracy: 0.2720 - loss: 1.5936 - val_accuracy: 0.3598 - val_loss: 1.3068
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.3862 - loss: 1.3074 - val_accuracy: 0.4173 - val_loss: 1.2671
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.5139 - loss: 1.1092 - val_accuracy: 0.5404 - val_loss: 1.0676
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.5922 - loss: 0.9669 - val_accuracy: 0.5171 - val_loss: 1.0771
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.6220 - loss: 0.8893 - val_accuracy: 0.4980 - val_loss: 1.1049
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 180ms/step - accuracy: 0.6611 - loss: 0.8169 - val_accuracy: 0.3484 - val_loss: 1.3304
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 183ms/step - accuracy: 0.6815 - loss: 0.7811 - val_accuracy: 0.3157 - val_loss: 1.7008
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.6943 - loss: 0.7455 - val_accuracy: 0.4437 - val_loss: 1.2567
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 180ms/step - accuracy: 0.7104 - loss: 0.7159 - val_accuracy: 0.6189 - val_loss: 0.9149
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.7342 - loss: 0.6633 - val_accuracy: 0.4882 - val_loss: 1.2792
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.7384 - loss: 0.6555 - val_accuracy: 0.2700 - val_loss: 1.6384
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.7456 - loss: 0.6286 - val_accuracy: 0.3086 - val_loss: 1.5652
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.7628 - loss: 0.5953 - val_accuracy: 0.6052 - val_loss: 1.1308
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.7771 - loss: 0.5612 - val_accuracy: 0.2913 - val_loss: 2.3052
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 180ms/step - accuracy: 0.7858 - loss: 0.5443 - val_accuracy: 0.7105 - val_loss: 0.7532
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.7999 - loss: 0.5178 - val_accuracy: 0.3858 - val_loss: 1.4378
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 184ms/step - accuracy: 0.8130 - loss: 0.4781 - val_accuracy: 0.3261 - val_loss: 2.5504
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 182ms/step - accuracy: 0.8219 - loss: 0.4658 - val_accuracy: 0.2948 - val_loss: 1.6454
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.8244 - loss: 0.4611 - val_accuracy: 0.3263 - val_loss: 3.4069
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 22s 181ms/step - accuracy: 0.8430 - loss: 0.4012 - val_accuracy: 0.7406 - val_loss: 0.7837
In [141]:
#Save training history
with open("EfficientNet_model_9_training_history.json","w") as f:
  json.dump(EfficientNet_model_9_history.history,f)

#Load training history
with open("EfficientNet_model_9_training_history.json","r") as f:
  EfficientNet_model_9_history_restored = json.load(f)

#save the trained model
EfficientNet_model_9.save("EfficientNet_model_9.keras")

EfficientNet_model_9_restored = load_model("EfficientNet_model_9.keras")
In [142]:
#plot training and validation accuracies and loss
dict_hist_9 = EfficientNet_model_9_history_restored

list_epoch = [i for i in range(1,21)]
list_epoch1 = [i for i in range(6,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'], ls = '--', label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  ls = '-.',label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '-.', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['val_accuracy'][5:],  label = 'Resnet_model_7_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['accuracy'],  label = 'EfficientNet_model_9_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['val_accuracy'],  label = 'EfficientNet_model_9_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('EfficientNet_model_9_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist_3['loss'], ls='-.', label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'],ls = '-.',  label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['loss'][5:],  label='Resnet_model_7_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['val_loss'][5:],  label='Resnet_model_7_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_9['loss'], ls = '--',  label='EfficientNet_model_9_loss_rgb')
plt.plot(list_epoch, dict_hist_9['val_loss'], ls = '--', label='EfficientNet_model_9_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend()
plt.savefig('EfficientNet_model_9_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image
In [143]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_EfficientNet_model_9 = EfficientNet_model_9_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_EfficientNet_model_9}")
4/4 - 10s - 2s/step - accuracy: 0.7656 - loss: 0.7192
Model accuracy on the test batch:[0.7192100882530212, 0.765625]
In [144]:
pred_EfficientNet_model_9 = EfficientNet_model_9_restored.predict(test_images)
pred_EfficientNet_model_9 = np.argmax(pred_EfficientNet_model_9, axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 6s 9ms/step
In [145]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [146]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_EfficientNet_model_9,'EfficientNet_model_9')
              precision    recall  f1-score   support

           0       0.73      0.94      0.82        32
           1       0.70      0.59      0.64        32
           2       0.69      0.75      0.72        32
           3       1.00      0.78      0.88        32

    accuracy                           0.77       128
   macro avg       0.78      0.77      0.76       128
weighted avg       0.78      0.77      0.76       128

No description has been provided for this image

Observations¶

  1. Allowing the weights of the EfficientNet model to adjust by training on our dataset improves performance. The overall EfficientNet model accuracy is 76.5%.
  2. EfficientNet models struggles to distinguish between sad and neutral faces.
In [147]:
visualizeImages(EfficientNet_model_9_restored,3,'EfficientNet_model_9')
1/1 ━━━━━━━━━━━━━━━━━━━━ 7s 7s/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
No description has been provided for this image

Think About It:

  1. What is your overall performance of these Transfer Learning Architectures ***When we use the transfer learning architectures freezing all the pre-learned weights and simply adding a fully connected network before classification, these models do not learn the fatures of the facial images well. It is ONLY when we allow the models to train on our data set, adjusting the weights that they improve. ***

  2. Can we draw a comparison of these models' performances. Overall, the transfer learning architectures once trained on our data set, they improve. Resnet, VGG16, and EfficientNet achieve high accuracies, greater than 73% on test data. In general all models struggle to classify sad and neutral faces. The simple CNN models perform fairly well with accuracies > 70% and efficient run times compared to the transfer learning approaches.

  3. Are we satisfied with the accuracies that we have received? The accuracies attained (>70%) on test data are reasable and useful especially since the simpler CNN models run efficiently. To improve the accuracy further, we can experiment with allowing the models to train on more epochs, training with larger datasets, data augmentation techniques, using hyper parameter tuning.

  • Do you think our issue lies with 'rgb' color_mode? I don't believe so because at the start of the project, we trained 2 CNN models, one on grayscale and the other on rgb images. These models had similar accuracy and f1-scores. What has helped the most is allowing the weights from the transfer learning models to adjust when training with our facial images data set.

Now that we have tried multiple pre-trained models, let's build a complex CNN architecture and see if we can get better performance.

Building a Complex Neural Network Architecture¶

In this section, we will build a more complex Convolutional Neural Network Model that has close to as many parameters as we had in our Transfer Learning Models. However, we will have only 1 input channel for our input images.

In [148]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)

Creating our Data Loaders¶

In this section, we are creating data loaders which we will use as inputs to the more Complicated Convolutional Neural Network. We will go ahead with color_mode = 'grayscale'.

In [149]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="grayscale",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.

Model Building¶

  • Try building a layer with 5 Convolutional Blocks and see if performance increases.
In [150]:
#method to create a convolutional neural network
def cnn_model_4():
  model = Sequential()

  #Add first Conv2D layer with 1024 filters, kernel of size 3, same padding and provide input shape
  model.add(Conv2D(filters=1024, kernel_size=(3,3), padding = 'same', input_shape = (48,48,1)))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add second Conv2D layer with 512 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=512, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add third Conv2D layer with 256 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=256, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(Dropout(0.2))
  #Add fourth Conv2D layer with 128 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=128, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add Batch Normalization
  model.add(BatchNormalization())
  #Add fifth Conv2D layer with 64 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=64, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(Dropout(0.2))
  #Add Batch Normalization
  model.add(BatchNormalization())
  #Flatten the data to prepare for the fully connected component
  model.add(Flatten())
  #Add dense layer with 512 neurons and relu activation function, dropout of 0.4
  model.add(Dense(512))
  model.add(Activation('silu'))
  model.add(Dropout(0.4))
  #Add classification layer
  model.add(Dense(4, activation = 'softmax'))
  model.compile(optimizer = Adam(learning_rate=0.001),
                loss = 'categorical_crossentropy',
                metrics = ['accuracy'])
  return model

Compiling and Training the Model¶

In [151]:
#Create first cnn model and publish summary
cnn_model_4 = cnn_model_4()

cnn_model_4.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                      │ (None, 48, 48, 1024)        │          10,240 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation (Activation)              │ (None, 48, 48, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d (MaxPooling2D)         │ (None, 24, 24, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 24, 24, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_1 (Conv2D)                    │ (None, 24, 24, 512)         │       4,719,104 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_1 (Activation)            │ (None, 24, 24, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_1 (MaxPooling2D)       │ (None, 12, 12, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 12, 12, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_2 (Conv2D)                    │ (None, 12, 12, 256)         │       1,179,904 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_2 (Activation)            │ (None, 12, 12, 256)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_2 (Dropout)                  │ (None, 12, 12, 256)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_3 (Conv2D)                    │ (None, 12, 12, 128)         │         295,040 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_3 (Activation)            │ (None, 12, 12, 128)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_2 (MaxPooling2D)       │ (None, 6, 6, 128)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_3 (Dropout)                  │ (None, 6, 6, 128)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ batch_normalization                  │ (None, 6, 6, 128)           │             512 │
│ (BatchNormalization)                 │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_4 (Conv2D)                    │ (None, 6, 6, 64)            │          73,792 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_4 (Activation)            │ (None, 6, 6, 64)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_4 (Dropout)                  │ (None, 6, 6, 64)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ batch_normalization_1                │ (None, 6, 6, 64)            │             256 │
│ (BatchNormalization)                 │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten (Flatten)                    │ (None, 2304)                │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)                        │ (None, 512)                 │       1,180,160 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_5 (Activation)            │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_5 (Dropout)                  │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 4)                   │           2,052 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 7,461,060 (28.46 MB)
 Trainable params: 7,460,676 (28.46 MB)
 Non-trainable params: 384 (1.50 KB)
In [152]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./cnn_model_4.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [153]:
#Fitting the model
cnn_model_4_history = cnn_model_4.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 50s 268ms/step - accuracy: 0.2691 - loss: 1.8399 - val_accuracy: 0.2924 - val_loss: 1.3466
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.2820 - loss: 1.3854 - val_accuracy: 0.3708 - val_loss: 1.3283
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.2976 - loss: 1.3679 - val_accuracy: 0.4277 - val_loss: 1.2685
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.3292 - loss: 1.3494 - val_accuracy: 0.4447 - val_loss: 1.2598
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.3676 - loss: 1.3149 - val_accuracy: 0.4683 - val_loss: 1.2283
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.4079 - loss: 1.2681 - val_accuracy: 0.4147 - val_loss: 1.2407
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.4560 - loss: 1.2119 - val_accuracy: 0.5256 - val_loss: 1.1205
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.4811 - loss: 1.1562 - val_accuracy: 0.5634 - val_loss: 1.0564
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5091 - loss: 1.1161 - val_accuracy: 0.5638 - val_loss: 1.0175
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5210 - loss: 1.0899 - val_accuracy: 0.5595 - val_loss: 1.0149
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.5396 - loss: 1.0599 - val_accuracy: 0.5908 - val_loss: 0.9680
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5432 - loss: 1.0408 - val_accuracy: 0.5991 - val_loss: 0.9475
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5592 - loss: 1.0146 - val_accuracy: 0.5817 - val_loss: 0.9852
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5741 - loss: 0.9932 - val_accuracy: 0.5985 - val_loss: 0.9312
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.5868 - loss: 0.9719 - val_accuracy: 0.6254 - val_loss: 0.8883
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.5878 - loss: 0.9581 - val_accuracy: 0.6323 - val_loss: 0.8808
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 118ms/step - accuracy: 0.5938 - loss: 0.9387 - val_accuracy: 0.6351 - val_loss: 0.8848
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.6160 - loss: 0.9073 - val_accuracy: 0.6400 - val_loss: 0.8600
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.6256 - loss: 0.8898 - val_accuracy: 0.6577 - val_loss: 0.8208
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 14s 119ms/step - accuracy: 0.6372 - loss: 0.8580 - val_accuracy: 0.6501 - val_loss: 0.8337

Evaluating the Model on Test Set¶

In [154]:
#Save training history
with open("cnn_model_4_training_history.json","w") as f:
  json.dump(cnn_model_4_history.history,f)

#Load training history
with open("cnn_model_4_training_history.json","r") as f:
  cnn_model_4_restored_history = json.load(f)

#save the trained model
cnn_model_4.save("cnn_model_4.keras")

cnn_model_4_restored = load_model("cnn_model_4.keras")
In [155]:
#plot training and validation accuracies and loss
dict_hist_10 = cnn_model_4_restored_history

list_epoch = [i for i in range(1,21)]
list_epoch1 = [i for i in range(6,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'],  label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '--', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['val_accuracy'][5:], ls = '--', label = 'Resnet_model_7_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['accuracy'],  label = 'EfficientNet_model_9_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['val_accuracy'], ls = '--', label = 'EfficientNet_model_9_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_10['accuracy'],  label = 'cnn_model_4_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_10['val_accuracy'], ls = '--', label = 'cnn_model_4_validation_accuracy_grayscale')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(title="Model accuracy", bbox_to_anchor=(1.05,1), loc="upper left")
plt.savefig('CNN_model_4_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist_3['loss'], label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'], label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['loss'][5:],  label='Resnet_model_7_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['val_loss'][5:], ls='-.',  label='Resnet_model_7_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_9['loss'],  label='EfficientNet_model_9_loss_rgb')
plt.plot(list_epoch, dict_hist_9['val_loss'], ls='-.',  label='EfficientNet_model_9_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_10['loss'],  label='cnn_model_4_loss_grayscale')
plt.plot(list_epoch, dict_hist_10['val_loss'], ls='-.', label='cnn_model_4_validation_loss_grayscale')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(title="Model loss", bbox_to_anchor=(1.05,1), loc="upper left")
plt.savefig('CNN_model_4_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image
In [156]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_cnn_model_4 = cnn_model_4_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_cnn_model_4}")
4/4 - 2s - 434ms/step - accuracy: 0.6406 - loss: 0.8276
Model accuracy on the test batch:[0.8276438117027283, 0.640625]
In [157]:
pred_cnn_model_4 = cnn_model_4_restored.predict(test_images)
pred_cnn_model_4 = np.argmax(pred_cnn_model_4 , axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 4ms/step  
In [158]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [159]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_cnn_model_4,'CNN_Model_4')
              precision    recall  f1-score   support

           0       0.76      0.69      0.72        32
           1       0.44      0.50      0.47        32
           2       0.51      0.59      0.55        32
           3       0.96      0.78      0.86        32

    accuracy                           0.64       128
   macro avg       0.67      0.64      0.65       128
weighted avg       0.67      0.64      0.65       128

No description has been provided for this image

Observations and Insights:__

  1. This CNN model has the highest number of parameters and has high accuracy of 64% on test data
  2. Unfortunately, the f1-score on sad faces is low 47%. The model inaccurately categorizes actual sad faces as neutral

Fit the latest CNN model on RGB images for ease of comparison to other transfer learning models¶

In [160]:
#Clear backend and assign random seed
from tensorflow.keras import backend as K
K.clear_session()
tf.random.set_seed(42)
In [161]:
batch_size = 128
folder_path = "Facial_emotion_images/"
classCategories = ['happy','sad','neutral','surprise']

#Parameters for training for ImageDataGenerator
datagen_train_params = {
    "horizontal_flip": True,
     "brightness_range": (0.0, 2.0),
     "rescale": 1.0/255,
     "shear_range": 0.3
    }

#Parameters for validation and test for ImageDataGenerator
datagen_val_test_params = {"rescale": 1.0/255}

datagen_train = ImageDataGenerator(**datagen_train_params)
datagen_val = ImageDataGenerator(**datagen_val_test_params)
datagen_test = ImageDataGenerator(**datagen_val_test_params)

def create_dataset(datagen, folder_name):
  return datagen.flow_from_directory(folder_path + folder_name,
                                              target_size = (picture_size, picture_size),
                                              color_mode="rgb",
                                              batch_size = batch_size,
                                              class_mode = 'categorical',
                                              classes = classCategories,
                                              shuffle = True)

train_set = create_dataset(datagen_train,"train/")
validation_set = create_dataset(datagen_val,"validation/")
test_set = create_dataset(datagen_test,"test/")
Found 14445 images belonging to 4 classes.
Found 4922 images belonging to 4 classes.
Found 128 images belonging to 4 classes.
In [162]:
#method to create a convolutional neural network
def cnn_model_5():
  model = Sequential()

  #Add first Conv2D layer with 1024 filters, kernel of size 3, same padding and provide input shape
  model.add(Conv2D(filters=1024, kernel_size=(3,3), padding = 'same', input_shape = (48,48,3)))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add second Conv2D layer with 512 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=512, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add third Conv2D layer with 256 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=256, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(Dropout(0.2))
  #Add fourth Conv2D layer with 128 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=128, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(Dropout(0.2))
  #Add Batch Normalization
  model.add(BatchNormalization())
  #Add fifth Conv2D layer with 64 filters, kernel of size 3, same padding and 'silu' activation
  model.add(Conv2D(filters=64, kernel_size=(3,3), padding = 'same'))
  model.add(Activation('silu'))
  model.add(Dropout(0.2))
  #Add Batch Normalization
  model.add(BatchNormalization())
  #Flatten the data to prepare for the fully connected component
  model.add(Flatten())
  #Add dense layer with 512 neurons and relu activation function, dropout of 0.4
  model.add(Dense(512))
  model.add(Activation('silu'))
  model.add(Dropout(0.4))
  #Add classification layer
  model.add(Dense(4, activation = 'softmax'))
  model.compile(optimizer = Adam(learning_rate=0.001),
                loss = 'categorical_crossentropy',
                metrics = ['accuracy'])
  return model
In [163]:
#Create first cnn model and publish summary
cnn_model_5 = cnn_model_5()

cnn_model_5.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                      │ (None, 48, 48, 1024)        │          28,672 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation (Activation)              │ (None, 48, 48, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d (MaxPooling2D)         │ (None, 24, 24, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 24, 24, 1024)        │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_1 (Conv2D)                    │ (None, 24, 24, 512)         │       4,719,104 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_1 (Activation)            │ (None, 24, 24, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_1 (MaxPooling2D)       │ (None, 12, 12, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 12, 12, 512)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_2 (Conv2D)                    │ (None, 12, 12, 256)         │       1,179,904 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_2 (Activation)            │ (None, 12, 12, 256)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_2 (Dropout)                  │ (None, 12, 12, 256)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_3 (Conv2D)                    │ (None, 12, 12, 128)         │         295,040 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_3 (Activation)            │ (None, 12, 12, 128)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ max_pooling2d_2 (MaxPooling2D)       │ (None, 6, 6, 128)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_3 (Dropout)                  │ (None, 6, 6, 128)           │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ batch_normalization                  │ (None, 6, 6, 128)           │             512 │
│ (BatchNormalization)                 │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_4 (Conv2D)                    │ (None, 6, 6, 64)            │          73,792 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_4 (Activation)            │ (None, 6, 6, 64)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_4 (Dropout)                  │ (None, 6, 6, 64)            │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ batch_normalization_1                │ (None, 6, 6, 64)            │             256 │
│ (BatchNormalization)                 │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten (Flatten)                    │ (None, 2304)                │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)                        │ (None, 512)                 │       1,180,160 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ activation_5 (Activation)            │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_5 (Dropout)                  │ (None, 512)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 4)                   │           2,052 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 7,479,492 (28.53 MB)
 Trainable params: 7,479,108 (28.53 MB)
 Non-trainable params: 384 (1.50 KB)
In [164]:
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

checkpoint = ModelCheckpoint("./cnn_model_5.keras", monitor='val_acc', verbose=1, save_best_only=True, mode='max')

early_stopping = EarlyStopping(monitor = 'val_loss',
                          min_delta = 0,
                          patience = 3,
                          verbose = 1,
                          restore_best_weights = True
                          )

reduce_learningrate = ReduceLROnPlateau(monitor = 'val_loss',
                              factor = 0.2,
                              patience = 3,
                              verbose = 1,
                              min_delta = 0.0001)

callbacks_list = [early_stopping, checkpoint, reduce_learningrate]

epochs = 20
In [165]:
#Fitting the model
cnn_model_5_history = cnn_model_5.fit(train_set,validation_data = validation_set, epochs=20)
Epoch 1/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 39s 245ms/step - accuracy: 0.2652 - loss: 1.7938 - val_accuracy: 0.2850 - val_loss: 1.3915
Epoch 2/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.2832 - loss: 1.3901 - val_accuracy: 0.4013 - val_loss: 1.3000
Epoch 3/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.3131 - loss: 1.3642 - val_accuracy: 0.4348 - val_loss: 1.2780
Epoch 4/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.3585 - loss: 1.3204 - val_accuracy: 0.2594 - val_loss: 1.6624
Epoch 5/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.4120 - loss: 1.2685 - val_accuracy: 0.4573 - val_loss: 1.1820
Epoch 6/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.4646 - loss: 1.1838 - val_accuracy: 0.5404 - val_loss: 1.0854
Epoch 7/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.5060 - loss: 1.1287 - val_accuracy: 0.5685 - val_loss: 1.0107
Epoch 8/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.5373 - loss: 1.0739 - val_accuracy: 0.5857 - val_loss: 0.9789
Epoch 9/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.5488 - loss: 1.0365 - val_accuracy: 0.6012 - val_loss: 0.9346
Epoch 10/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.5696 - loss: 0.9997 - val_accuracy: 0.6402 - val_loss: 0.8584
Epoch 11/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.5902 - loss: 0.9483 - val_accuracy: 0.6392 - val_loss: 0.8580
Epoch 12/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.6113 - loss: 0.9079 - val_accuracy: 0.6670 - val_loss: 0.8119
Epoch 13/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 175ms/step - accuracy: 0.6311 - loss: 0.8673 - val_accuracy: 0.6245 - val_loss: 0.9103
Epoch 14/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.6432 - loss: 0.8481 - val_accuracy: 0.7005 - val_loss: 0.7383
Epoch 15/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.6581 - loss: 0.8026 - val_accuracy: 0.7113 - val_loss: 0.7131
Epoch 16/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.6780 - loss: 0.7758 - val_accuracy: 0.7152 - val_loss: 0.7222
Epoch 17/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.6919 - loss: 0.7497 - val_accuracy: 0.7068 - val_loss: 0.7369
Epoch 18/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.6940 - loss: 0.7356 - val_accuracy: 0.6957 - val_loss: 0.7485
Epoch 19/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 176ms/step - accuracy: 0.7113 - loss: 0.7016 - val_accuracy: 0.7249 - val_loss: 0.6756
Epoch 20/20
113/113 ━━━━━━━━━━━━━━━━━━━━ 21s 177ms/step - accuracy: 0.7185 - loss: 0.6956 - val_accuracy: 0.7308 - val_loss: 0.6759
In [166]:
#Save training history
with open("cnn_model_5_training_history.json","w") as f:
  json.dump(cnn_model_5_history.history,f)

#Load training history
with open("cnn_model_5_training_history.json","r") as f:
  cnn_model_5_restored_history = json.load(f)

#save the trained model
cnn_model_5.save("cnn_model_5.keras")

cnn_model_5_restored = load_model("cnn_model_5.keras")
In [167]:
#plot training and validation accuracies and loss
dict_hist_11 = cnn_model_5_restored_history

list_epoch = [i for i in range(1,21)]
list_epoch1 = [i for i in range(6,21)]

plt.figure(figsize = (7,7))
plt.plot(list_epoch, dict_hist_3['accuracy'],  label = 'cnn_model_3_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_3['val_accuracy'], ls = '--', label = 'cnn_model_3_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_5['accuracy'],  label = 'vgg_model_5_accuracy_rgb')
plt.plot(list_epoch, dict_hist_5['val_accuracy'], ls = '--', label = 'vgg_model_5_validation_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['accuracy'][5:],  label = 'Resnet_model_7_accuracy_rgb')
plt.plot(list_epoch1, dict_hist_7['val_accuracy'][5:], ls = '--', label = 'Resnet_model_7_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['accuracy'],  label = 'EfficientNet_model_9_accuracy_rgb')
plt.plot(list_epoch, dict_hist_9['val_accuracy'], ls = '--', label = 'EfficientNet_model_9_validation_accuracy_rgb')
plt.plot(list_epoch, dict_hist_10['accuracy'],  label = 'cnn_model_4_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_10['val_accuracy'], ls = '--', label = 'cnn_model_4_validation_accuracy_grayscale')
plt.plot(list_epoch, dict_hist_11['accuracy'],  label = 'cnn_model_4_accuracy_rgb')
plt.plot(list_epoch, dict_hist_11['val_accuracy'], ls = '--', label = 'cnn_model_4_validation_accuracy_rgb')

plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(title="Model accuracy", bbox_to_anchor=(1.05,1), loc="upper left")
plt.savefig('CNN_model_5_acc.png', format="png", dpi=300, bbox_inches="tight")
plt.show()

plt.figure(figsize=(7,7))
plt.plot(list_epoch, dict_hist_3['loss'], label='cnn_model_3_loss_grayscale')
plt.plot(list_epoch, dict_hist_3['val_loss'], ls='-.', label='cnn_model_3_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_5['loss'], label='vgg_model_5_loss_rgb')
plt.plot(list_epoch, dict_hist_5['val_loss'], ls = '-.', label='vgg_model_5_validation_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['loss'][5:],  label='Resnet_model_7_loss_rgb')
plt.plot(list_epoch1, dict_hist_7['val_loss'][5:], ls='-.',  label='Resnet_model_7_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_9['loss'],  label='EfficientNet_model_9_loss_rgb')
plt.plot(list_epoch, dict_hist_9['val_loss'], ls='-.',  label='EfficientNet_model_9_validation_loss_rgb')
plt.plot(list_epoch, dict_hist_10['loss'],  label='cnn_model_4_loss_grayscale')
plt.plot(list_epoch, dict_hist_10['val_loss'], ls='-.', label='cnn_model_4_validation_loss_grayscale')
plt.plot(list_epoch, dict_hist_11['loss'],  label='cnn_model_4_loss_rgb')
plt.plot(list_epoch, dict_hist_11['val_loss'], ls='-.', label='cnn_model_4_validation_loss_rgb')

plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(title="Model loss", bbox_to_anchor=(1.05,1), loc="upper left")
plt.savefig('CNN_model_5_loss.png', format="png", dpi=300, bbox_inches="tight")
plt.show()
No description has been provided for this image
No description has been provided for this image
In [168]:
#Fetch a single batch of data
test_images, test_labels = next(test_set)
accuracy_cnn_model_5 = cnn_model_5_restored.evaluate(test_images, test_labels, verbose=2)
print(f"Model accuracy on the test batch:{accuracy_cnn_model_5}")
4/4 - 1s - 349ms/step - accuracy: 0.7969 - loss: 0.5320
Model accuracy on the test batch:[0.5319868922233582, 0.796875]
In [169]:
pred_cnn_model_5 = cnn_model_5_restored.predict(test_images)
pred_cnn_model_5 = np.argmax(pred_cnn_model_5 , axis=1)
y_true = np.argmax(test_labels, axis=1)
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 4ms/step  
In [170]:
print(train_set.class_indices)
{'happy': 0, 'sad': 1, 'neutral': 2, 'surprise': 3}
In [171]:
#plot confusion matrix from the first model
metrics_score(y_true,pred_cnn_model_5,'CNN_model_5')
              precision    recall  f1-score   support

           0       0.88      0.88      0.88        32
           1       0.68      0.66      0.67        32
           2       0.70      0.81      0.75        32
           3       0.96      0.84      0.90        32

    accuracy                           0.80       128
   macro avg       0.80      0.80      0.80       128
weighted avg       0.80      0.80      0.80       128

No description has been provided for this image
In [172]:
visualizeImages(cnn_model_5_restored,3,'CNN_Model_5')
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 770ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
No description has been provided for this image

Observations¶

  1. Looking at a few images and how the latest CNN model classified them, we see that the model struggles to correctly distinguish sad verses neutral faces. In the last row of images, two actual neutral faces are misclassified as sad.

  2. When misclassifications occur, the assigned probability is low implying that the model can be improved to correctly classify these sad and neutral facial images.

Compare the various models trained¶

In [180]:
#Model comparison
def CompareModels():
  from sklearn.metrics import classification_report

  cnn_model_2_restored = load_model("cnn_model_2.keras")
  vgg_model_4_restored = load_model("vgg_model_4.keras")
  vgg_model_5_restored = load_model("vgg_model_5.keras")
  Resnet_model_6_restored = load_model("Resnet_model_6.keras")
  Resnet_model_7_restored = load_model("Resnet_model_7.keras")
  EfficientNet_model_8_restored = load_model("EfficientNet_model_8.keras")
  EfficientNet_model_9_restored = load_model("EfficientNet_model_9.keras")
  cnn_model_5_restored = load_model("cnn_model_5.keras")

  pred_cnn_model_2 = cnn_model_2_restored.predict(test_images)
  pred_cnn_model_2_labels = np.argmax(pred_cnn_model_2, axis=1)
  pred_vgg_model_4 = vgg_model_4_restored.predict(test_images)
  pred_vgg_model_4_labels = np.argmax(pred_vgg_model_4, axis=1)
  pred_vgg_model_5 = vgg_model_5_restored.predict(test_images)
  pred_vgg_model_5_labels = np.argmax(pred_vgg_model_5, axis=1)
  pred_Resnet_model_6 = Resnet_model_6_restored.predict(test_images)
  pred_Resnet_model_6_labels = np.argmax(pred_Resnet_model_6, axis=1)
  pred_Resnet_model_7 = Resnet_model_7_restored.predict(test_images)
  pred_Resnet_model_7_labels = np.argmax(pred_Resnet_model_7, axis=1)
  pred_EfficientNet_model_8 = EfficientNet_model_8_restored.predict(test_images)
  pred_EfficientNet_model_8_labels = np.argmax(pred_EfficientNet_model_8, axis=1)
  pred_EfficientNet_model_9 = EfficientNet_model_9_restored.predict(test_images)
  pred_EfficientNet_model_9_labels = np.argmax(pred_EfficientNet_model_9, axis=1)
  pred_cnn_model_5 = cnn_model_5_restored.predict(test_images)
  pred_cnn_model_5_labels = np.argmax(pred_cnn_model_5, axis=1)

  actual = y_true

  #Map numeric labels to emotion names
  emotion_names = {0:"happy", 1:"sad", 2:"neutral", 3:"surprise"}
  actual_named = [emotion_names[label] for label in actual]

  reports = {}

  for model_name, (actual, predicted) in {
      "CNN_Model_1": (actual, pred_cnn_model_2_labels),
      "VGG16_Model": (actual, pred_vgg_model_4_labels),
      "Best_VGG16_Model": (actual, pred_vgg_model_5_labels),
      "Resnet_Model": (actual, pred_Resnet_model_6_labels),
      "Best_Resnet_Model": (actual, pred_Resnet_model_7_labels),
      "EfficientNet_Model": (actual, pred_EfficientNet_model_8_labels),
      "Best_EfficientNet_Model": (actual, pred_EfficientNet_model_9_labels),
      "CNN_Model_4": (actual, pred_cnn_model_5_labels)
  }.items():
    predicted_named = [emotion_names[label] for label in predicted]
    reports[model_name] = classification_report(actual_named, predicted_named, output_dict=True)

  data = []
  accuracy_data = []
  #Extract accuracy for the models
  for model_name, report in reports.items():
    accuracy = report["accuracy"]
    accuracy_data.append({
        "Model": model_name,
        "Metric":"Accuracy",
        "Value":accuracy
    })
  #Extract F1 score
  for model_name, report in reports.items():
    for emotion, metrics in report.items():
      if isinstance(metrics, dict):
        data.append({
            "Model": model_name,
            "Emotion": emotion,
            "Precision": metrics['precision'],
            "Recall": metrics['recall'],
            "F1-Score": metrics["f1-score"],
            "Support": metrics['support']
        })

  df = pd.DataFrame(data)
  df_accuracy = pd.DataFrame(accuracy_data)
  #Visualize F1 score comparision
  plt.figure(figsize=(10,6))
  sns.barplot(x="Emotion", y="F1-Score", hue="Model", data=df)
  plt.title("F1-Score Comparison Across models")
  plt.xlabel("Emotion")
  plt.xticks(rotation=45)
  plt.ylabel("F1-Score")
  plt.legend(title="Model F1-Score", bbox_to_anchor=(1.05,1), loc="upper left")
  plt.axhline(y=0.6, color='r', linestyle='--',label='60% F1-Score')
  plt.savefig('f1_Score_Model_Comparison.png', format="png", dpi=300, bbox_inches="tight")
  plt.show()

  #Visualize accuracy comparison
  plt.figure(figsize=(8,4))
  sns.barplot(x="Model", y="Value",  data=df_accuracy, hue="Model")
  plt.title("Accuracy comparison across models")
  plt.xlabel("Model")
  plt.xticks(rotation=90)
  plt.ylabel("Accuracy")
  plt.legend(title="Model Accuracy", bbox_to_anchor=(1.05,0.5), loc="lower left")
  plt.ylim(0,1)
  plt.axhline(y=0.7, color='r', linestyle='--',label='70% Accuracy')
  plt.tight_layout()
  plt.savefig('Acc_Model_Comparison.png', format="png", dpi=300, bbox_inches="tight")
  plt.show()

  df = df.drop(columns=["Support"], errors='ignore')
  print(df)
  print(df_accuracy)
In [181]:
CompareModels()
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step  
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step  
4/4 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step  
4/4 ━━━━━━━━━━━━━━━━━━━━ 6s 11ms/step
4/4 ━━━━━━━━━━━━━━━━━━━━ 6s 10ms/step
4/4 ━━━━━━━━━━━━━━━━━━━━ 5s 9ms/step
4/4 ━━━━━━━━━━━━━━━━━━━━ 5s 9ms/step
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step  
No description has been provided for this image
WARNING:matplotlib.legend:No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image
                      Model       Emotion  Precision    Recall  F1-Score
0               CNN_Model_1         happy   0.805556  0.906250  0.852941
1               CNN_Model_1       neutral   0.545455  0.750000  0.631579
2               CNN_Model_1           sad   0.619048  0.406250  0.490566
3               CNN_Model_1      surprise   0.962963  0.812500  0.881356
4               CNN_Model_1     macro avg   0.733255  0.718750  0.714111
5               CNN_Model_1  weighted avg   0.733255  0.718750  0.714111
6               VGG16_Model         happy   0.576923  0.468750  0.517241
7               VGG16_Model       neutral   0.358491  0.593750  0.447059
8               VGG16_Model           sad   0.523810  0.343750  0.415094
9               VGG16_Model      surprise   0.821429  0.718750  0.766667
10              VGG16_Model     macro avg   0.570163  0.531250  0.536515
11              VGG16_Model  weighted avg   0.570163  0.531250  0.536515
12         Best_VGG16_Model         happy   0.764706  0.812500  0.787879
13         Best_VGG16_Model       neutral   0.560976  0.718750  0.630137
14         Best_VGG16_Model           sad   0.714286  0.625000  0.666667
15         Best_VGG16_Model      surprise   1.000000  0.781250  0.877193
16         Best_VGG16_Model     macro avg   0.759992  0.734375  0.740469
17         Best_VGG16_Model  weighted avg   0.759992  0.734375  0.740469
18             Resnet_Model         happy   0.243902  0.937500  0.387097
19             Resnet_Model       neutral   0.000000  0.000000  0.000000
20             Resnet_Model           sad   0.000000  0.000000  0.000000
21             Resnet_Model      surprise   0.000000  0.000000  0.000000
22             Resnet_Model     macro avg   0.060976  0.234375  0.096774
23             Resnet_Model  weighted avg   0.060976  0.234375  0.096774
24        Best_Resnet_Model         happy   0.931034  0.843750  0.885246
25        Best_Resnet_Model       neutral   0.583333  0.875000  0.700000
26        Best_Resnet_Model           sad   0.782609  0.562500  0.654545
27        Best_Resnet_Model      surprise   0.892857  0.781250  0.833333
28        Best_Resnet_Model     macro avg   0.797458  0.765625  0.768281
29        Best_Resnet_Model  weighted avg   0.797458  0.765625  0.768281
30       EfficientNet_Model         happy   0.250000  1.000000  0.400000
31       EfficientNet_Model       neutral   0.000000  0.000000  0.000000
32       EfficientNet_Model           sad   0.000000  0.000000  0.000000
33       EfficientNet_Model      surprise   0.000000  0.000000  0.000000
34       EfficientNet_Model     macro avg   0.062500  0.250000  0.100000
35       EfficientNet_Model  weighted avg   0.062500  0.250000  0.100000
36  Best_EfficientNet_Model         happy   0.731707  0.937500  0.821918
37  Best_EfficientNet_Model       neutral   0.685714  0.750000  0.716418
38  Best_EfficientNet_Model           sad   0.703704  0.593750  0.644068
39  Best_EfficientNet_Model      surprise   1.000000  0.781250  0.877193
40  Best_EfficientNet_Model     macro avg   0.780281  0.765625  0.764899
41  Best_EfficientNet_Model  weighted avg   0.780281  0.765625  0.764899
42              CNN_Model_4         happy   0.875000  0.875000  0.875000
43              CNN_Model_4       neutral   0.702703  0.812500  0.753623
44              CNN_Model_4           sad   0.677419  0.656250  0.666667
45              CNN_Model_4      surprise   0.964286  0.843750  0.900000
46              CNN_Model_4     macro avg   0.804852  0.796875  0.798822
47              CNN_Model_4  weighted avg   0.804852  0.796875  0.798822
                     Model    Metric     Value
0              CNN_Model_1  Accuracy  0.718750
1              VGG16_Model  Accuracy  0.531250
2         Best_VGG16_Model  Accuracy  0.734375
3             Resnet_Model  Accuracy  0.234375
4        Best_Resnet_Model  Accuracy  0.765625
5       EfficientNet_Model  Accuracy  0.250000
6  Best_EfficientNet_Model  Accuracy  0.765625
7              CNN_Model_4  Accuracy  0.796875

Plotting the Confusion Matrix for the chosen final model¶

Observations and Insights:__

  1. The best models are the transfer learning architectures (where we allow weights for the last 4 layers to retrain on our rgb dataset) and the last complex CNN model (CNN_model_4). They both show an f1-score > 60% for all emotion categories and the highest overall model accuracy of ~73%. Both models ran for 7 minutes on GPU. However the CNN model has 7.5 million parameters while the complex transfer learning models has >10 million parameters.

  2. The selected model is CNN model 4 which is slightly simpler and yield high f1-scores of > 65% for all classification categories and a model accuracy of 79%.

In [175]:
#The confusion matrix from the best model: CNN model 4 but trained on RGB and labeled as model 5
cnn_model_5_restored = load_model("cnn_model_5.keras")
pred_cnn_model_5 = cnn_model_5_restored.predict(test_images)
pred_cnn_model_5 = np.argmax(pred_cnn_model_5 , axis=1)
metrics_score(y_true,pred_cnn_model_5,'CNN_Model_5_Best')
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step  
              precision    recall  f1-score   support

           0       0.88      0.88      0.88        32
           1       0.68      0.66      0.67        32
           2       0.70      0.81      0.75        32
           3       0.96      0.84      0.90        32

    accuracy                           0.80       128
   macro avg       0.80      0.80      0.80       128
weighted avg       0.80      0.80      0.80       128

No description has been provided for this image

Conclusion:____________¶

  1. We developed several models that take input facial images and classify the emotions displayed. 55% of human interactions is through human expressions. Efficient and accurate models for emotion detection takes us a step further in enhancing AI emotional intelligence with applications in the medical field (understanding patient experience), in the service field (to improve customer experience) and more.
  2. The first models build were convolutional neural networks developed here. The models ran in ~4 minutes on GPU with an accuracy of ~70% on test data.
  3. Transfer learning models showed low performance in terms of accuracy when the pre-trained weights were fixed. Accuracy was about 25% (matched to random guess approximation). Once these models trained on our data set, they showed better performance of > 70% for overall accuracy in all cases.
  4. All models struggle to correctly classify sad and neutral faces. The f1 score for these emotions hover around 45 - 67 % at best. The CNN models using a silu activation function seem to give the best f1-scores
  5. Some of the transfer learning models e.g. Efficient Net when trained on our data set (allowing weights to adjust based on our data set), were overfitting. Accuracy on train data was better than on validation data. These models do not generalize well to unseen data.

Refined insights:¶

What are the most meaningful insights from the data relevant to the problem?

  1. The training dataset influences model performance significantly. CNN models developed here and trained on the data set outperform transfer learning models when we use fixed weights from the transfer models. Allowing the transfer models to train on our data set increases model perfomance although the penalty is that these complex models require long training times (factor of 2X impact in training time).

  2. I did not observe a large impact when we trained with rgb verses grayscale images in terms of model accuracy. The images are grayscale and I recommend training on grayscale images.

Comparison of various techniques and their relative performance:¶

- How do different techniques perform? Which one is performing relatively better? Is there scope to improve the performance further?

  1. The CNN models developed here achieve high accuracy (~79% on test data and f1-scores of >= 67% on the most challenging emotions (sad and neutral). These models run fast ~4-7 minutes on GPU.

  2. The transfer learning architectures need training on our dataset to achieve high accuracy. This requires long training times and compute resources (~9-10 minutes on GPU). They seem to overfit on training data and generalize poorly on unseen data.

Proposal for the final solution design:¶

  • What model do you propose to be adopted? Why is this the best solution to adopt?
  1. The best model to use is the last CNN model. It trains in 7 minutes. Has an accuracy of ~79% and f1-score of 67% for the sad and neutral face category which is the most difficult to classify accurately. This model matches the performance of the best transfer models for both f1-score and accuracy, yet it has fewer trainable parameters.

  2. This model can be improved further by:

  • Training on larger data sets
  • Mitigating class imbalance during training and validation
  • Allowing the training to improve over more epochs
  • Hyper parameter tuning to improve accuracy and f1-score
  • Building a more complex CNN with higher accuracy and f1-score. Somehow enhancing differences between sad and neutral faces to make the model more accurate in classifying these emotions that are challenging to distinguish
In [182]:
#save the project file to HTML
!jupyter nbconvert --to html '/content/drive/MyDrive/MachineLearningCourse/CapstoneProject/Facial_Emotion_Detection_Full_Code_Moureen_Kemei_CapStoneProject.ipynb'
[NbConvertApp] Converting notebook /content/drive/MyDrive/MachineLearningCourse/CapstoneProject/Facial_Emotion_Detection_Full_Code_Moureen_Kemei_CapStoneProject.ipynb to html
[NbConvertApp] WARNING | Alternative text is missing on 88 image(s).
[NbConvertApp] Writing 7511521 bytes to /content/drive/MyDrive/MachineLearningCourse/CapstoneProject/Facial_Emotion_Detection_Full_Code_Moureen_Kemei_CapStoneProject.html
In [ ]: